Python Interpreter에서 업데이트된 패키지를 다시 가져오려면 어떻게 해야 합니까?
저는 종종 Python Interpreter에서 모듈을 테스트하고 오류가 발생하면 .py 파일을 빠르게 업데이트합니다.그러나 인터프리터에 반영하려면 어떻게 해야 합니까?지금까지 인터프리터를 종료하고 다시 들어가려고 했습니다.파일을 다시 Import해도 문제가 없기 때문입니다.
Python3 업데이트: (지난번 편집/댓글에서 권장되지 않는 메서드를 제안했기 때문에 이미 답변된 답변에서 인용)
3, Python 3의 경우
reload
모듈로 이동되었습니다.3.4에서는imp
는 에 의해 폐지되어 후자에 추가되었습니다.3 이후를 대상으로 할 때는 콜할 때 해당 모듈을 참조합니다.reload
수입하다
테이크 아웃:
- > .4: Python3 > = 3.4:
importlib.reload(packagename)
- . : Python3 < 3 . 4 :
imp.reload(packagename)
- Python2: 아래 계속
하다를 사용하세요.reload
장장: :
https://docs.python.org/2/library/functions.html#reload
reload(module)
뭇매를 맞다
- Python 모듈의 코드가 다시 컴파일되고 모듈 수준 코드가 다시 실행되어 모듈 사전의 이름에 바인딩된 새로운 개체 집합을 정의합니다.확장 모듈의 init 함수는 second time이라고 부르지 않습니다.
- Python의 다른 모든 객체와 마찬가지로 오래된 객체는 참조 수가 0으로 떨어진 후에만 회수됩니다.
- 모듈 네임스페이스의 이름이 새로 생성되거나 변경된 개체를 가리키도록 업데이트됩니다.
- 오래된 오브젝트에 대한 기타 참조(모듈 외부 이름 등)는 새로운 오브젝트를 참조하기 위해 리바운드되지 않으며 필요에 따라 오브젝트가 발생하는 각 네임스페이스에서 갱신해야 합니다.
예제:
# Make a simple function that prints "version 1"
shell1$ echo 'def x(): print "version 1"' > mymodule.py
# Run the module
shell2$ python
>>> import mymodule
>>> mymodule.x()
version 1
# Change mymodule to print "version 2" (without exiting the python REPL)
shell2$ echo 'def x(): print "version 2"' > mymodule.py
# Back in that same python session
>>> reload(mymodule)
<module 'mymodule' from 'mymodule.pyc'>
>>> mymodule.x()
version 2
에 위의 모든 reload()
★★★★★★★★★★★★★★★★★」imp.reload()
을 사용하다
reload()
3 및 python 3에 .imp.reload()
권장되지 됩니다( 참조).help(imp)
를 참조해 주세요.
대신 사용하는 것이 좋습니다.
파일을 다시 Import할 수 없기 때문에 지금까지 인터프리터를 종료하고 재입력하고 있습니다.
,, 그, 고, 고, 고, 고, 고, 고, 고, 고, 고.import
의 기존 을 다시 .sys.modules
.
말할 수 요.reload(module)
sys.modules
이 단일 모듈의 새 복사본을 얻습니다.단, 다른 모듈이 원래 모듈 또는 원래 모듈의 오브젝트에 대한 참조를 가지고 있는 경우 오래된 참조는 그대로 유지되며 매우 혼란스러운 일이 발생합니다.
a
모듈에 따라 다름).b
, , , , 입니다.b
이렇게 'b'는 'b'는 'b'는 'b'는요?패키지의 입니다), 두 모듈을 수 .「 」 「 」 「 」 「 2 」를 하면, 「 」( 「 」 ) 「 」새로고침하면 됩니다.p.a
그것은 오래된 것에 대한 참조를 얻을 것이다.p.b
그도 마찬가지입니다그리고 역도 성립.밖에 없습니다.이 있습니다.sys.modules
수입하다이는 모듈 엔트리가 failed-relative-import 마커로서 None이 되는 것과 관련이 있으며 실제적인 함정이 있습니다.
코덱을 등록하거나 경고 핸들러를 추가하는 등 오브젝트에 대한 참조를 시스템 모듈로 전달하는 모듈이 있는 경우 시스템 모듈을 새로고침할 때 Python 환경을 혼란스럽게 합니다.
1개의 스크립트에 는, 「」 「1」 「1」입니다.reload()
를 올바르게 맞추려면 매우 까다롭습니다.암시적으로 '코너'를 사용하고 있다면 인터프리터 사이클을 계속하는 것이 좋을 것입니다.
Python 3에서는 동작이 변경됩니다.
>>> import my_stuff
...my_strup으로 뭔가 한 다음, 나중에:
>>>> import imp
>>>> imp.reload(my_stuff)
새로고침된 my_strup을 얻을 수 있습니다.
번 Import에서 수 sys.modules
요 - 로딩되어 있었어요import mymodule
위의 답변과 앞의 답변에 모두 약간의 답변이 있기 때문에 한 번에 정리하려고 합니다.
내장 기능 사용:
Python 2.x의 경우 - 내장된 함수를 사용합니다.
Python 3.x의 경우 - 를 사용합니다.
Python 3.4의 경우 - Python 3.4의 경우imp
위해 importlib
즉,
몇 가지 주의사항:
- 일반적으로 내장 모듈 또는 동적으로 로드된 모듈을 새로고침하는 것은 그다지 유용하지 않습니다. 중
sys
,__main__
기타 주요 모듈은 권장하지 않습니다. - 대부분의 경우 확장 모듈은 여러 번 초기화되지 않도록 설계되어 새로고침 시 임의의 방법으로 장애가 발생할 수 있습니다.이 "Import"를 사용하여 에서 개체를 Import하는
from
import
콜..., 콜..., 콜...reload()
으로는 Import를 다시 .이이 、 피피하하하지지지 지지 、from
또 것은 '아니다', '아니다', '아니다'입니다.import
module.name에 있습니다. - 모듈이 클래스의 인스턴스를 인스턴스화한 경우 클래스를 정의하는 모듈을 새로고침해도 인스턴스의 메서드 정의에 영향을 주지 않습니다.클래스 정의는 계속 사용됩니다.파생 클래스도 마찬가지입니다.
외부 패키지:
remport - Reimport는 현재 Python 2.4~2.7을 지원합니다.
xreload - 스크래치 네임스페이스에서 모듈을 실행한 후 클래스, 메서드 및 함수에 패치를 적용함으로써 작동합니다.이렇게 하면 인스턴스에 패치를 적용할 필요가 없습니다.새 개체가 대상 네임스페이스에 복사됩니다.
livecoding - 코드 새로고침을 통해 실행 중인 응용 프로그램이 사용하는 Python 스크립트의 변경에 따라 동작을 변경할 수 있습니다.라이브러리는 Python 스크립트가 수정된 것을 감지하면 해당 스크립트를 새로고침하고 이전에 새로고침된 버전에서 사용할 수 있도록 만든 개체를 바꿉니다.툴로서 프로그래머는 워크플로우 중단과 그에 따른 집중력 상실을 방지할 수 있습니다.플로우 상태를 유지할 수 있습니다.이전에 변경된 코드를 활성화하기 위해 응용 프로그램을 재시작해야 했던 경우에는 이러한 변경 사항을 즉시 적용할 수 있습니다.
기본적으로 모든 사용자 코드의 asnwer와 같이 새로고침합니다.그러나 이미 인스턴스화된 개체 또는 참조된 함수의 기본 코드는 변경되지 않습니다.그의 답변에서 확장:
#Make a simple function that prints "version 1"
shell1$ echo 'def x(): print "version 1"' > mymodule.py
# Run the module
shell2$ python
>>> import mymodule
>>> mymodule.x()
version 1
>>> x = mymodule.x
>>> x()
version 1
>>> x is mymodule.x
True
# Change mymodule to print "version 2" (without exiting the python REPL)
shell2$ echo 'def x(): print "version 2"' > mymodule.py
# Back in that same python session
>>> reload(mymodule)
<module 'mymodule' from 'mymodule.pyc'>
>>> mymodule.x()
version 2
>>> x()
version 1
>>> x is mymodule.x
False
간단한 답변:
Reinport를 사용해 보십시오.Python의 풀기능 새로고침입니다.
더 긴 답변:
이 질문은 remport 출시 전에 이미 질문/답변된 것으로 보입니다.이것은 "Python의 풀기능 새로고침"이라고 광고하고 있습니다.
이 모듈은 Python의 새로고침 기능을 완전히 대체할 것입니다.이는 더 오래 실행되는 응용 프로그램에서 사용되는 Python 플러그인 및 확장 기능에 적합한 새로고침을 만드는 것을 목표로 합니다.
Reimport는 현재 Python 2.4~2.6을 지원합니다.
본질적으로 이것은 완전히 해결될 수 있는 문제가 아니다.이 모듈의 목적은 가장 일반적인 종류의 업데이트가 올바르게 작동하도록 하는 것입니다.또한 개별 모듈과 패키지가 프로세스를 지원할 수 있습니다.자세한 내용은 개요 페이지를 참조하십시오.
the : , 、 、reimport
Python 2.4부터 2.6까지를 명시적으로 지원하며, 2.7에서 사용해 봤는데 잘 작동하는 것 같습니다.
이것이 모든 것을 예상할 수 있을지는 모르겠지만, 그렇게 할 수 있습니다.
>>> del mymodule
>>> import mymodule
import sys
del sys.modules['module_name']
종속 모듈이 새로고침되지 않는 방법과 그 영향에 대한 자세한 설명은 여기를 참조하십시오.
http://pyunit.sourceforge.net/notes/reloading.html
pyunit은 __import_를 덮어쓰고 의존 모듈을 추적한 후 sys.modules에서 각 모듈을 삭제하고 다시 Import하는 방법을 사용했습니다.그냥 재장전했을 수도 있어요
잠자리 대답이 통했어요(3.4.3항).
import sys
del sys.modules['module_name']
다음으로 하위 레벨의 솔루션을 제시하겠습니다.
exec(open("MyClass.py").read(), globals())
언급URL : https://stackoverflow.com/questions/684171/how-to-re-import-an-updated-package-while-in-python-interpreter
'programing' 카테고리의 다른 글
여러 프로젝트/모듈에서 PropertyPlaceholderConfigr을 통해 여러 속성 파일 사용 (0) | 2022.10.07 |
---|---|
v-module 질문, 개체 어레이 목록의 날짜를 기준으로 날짜를 사용하지 않도록 설정하는 방법 (0) | 2022.10.07 |
동적 키를 사용하여 개체 만들기 (0) | 2022.10.07 |
소수점 이하 2자리까지 반올림 할 수 있나요? (0) | 2022.10.07 |
java: 해시맵이 작동하지 않음 (0) | 2022.10.07 |