development

파이썬 인터프리터에서 업데이트 된 패키지를 다시 가져 오는 방법은 무엇입니까?

big-blog 2020. 2. 25. 22:49
반응형

파이썬 인터프리터에서 업데이트 된 패키지를 다시 가져 오는 방법은 무엇입니까? [복제]


이 질문에는 이미 답변이 있습니다.

나는 종종 파이썬 인터프리터에서 모듈을 테스트하고 오류가 발생하면 .py 파일을 빠르게 업데이트합니다. 그러나 통역사에 어떻게 반영합니까? 그래서 지금까지 파일을 다시 가져 오는 것이 효과가 없기 때문에 통역사를 종료하고 다시 입력했습니다.


Python3 업데이트 : ( 마지막으로 편집 된 주석이 더 이상 사용되지 않는 방법을 제안했기 때문에 이미 답변 된 답변 에서 인용 됨 )

파이썬 3에서는 모듈 reload로 옮겨졌습니다 imp. 3.4에서는 imp찬성이 사용됩니다 importlib, 그리고 reload후자에 추가되었습니다. 3 이상을 대상으로하는 경우 호출 reload하거나 가져올 때 적절한 모듈을 참조하십시오 .

테이크 아웃 :

  • 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)실행될 :

  • 파이썬 모듈의 코드가 다시 컴파일되고 모듈 수준 코드가 다시 실행되어 모듈 사전의 이름에 바인딩되는 새로운 객체 집합을 정의합니다. 확장 모듈의 초기화 기능은 두 번째로 호출되지 않습니다.
  • 파이썬의 다른 모든 객체와 마찬가지로 이전 객체는 참조 횟수가 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에서 내장 함수가 아니며 더 이상 imp.reload()사용되지 않는 것으로 표시됩니다 (참조 help(imp)).

importlib.reload()대신 사용하는 것이 좋습니다.


그래서 지금까지 파일을 다시 가져 오는 것이 효과가 없기 때문에 통역사를 종료하고 다시 입력했습니다.

예, import다시 말하면의 기존 모듈 사본이 제공됩니다 sys.modules.

해당 단일 모듈의 새 사본 reload(module)을 업데이트 sys.modules하고 가져 오라고 말할 수 있지만 다른 모듈에 원래 모듈 또는 원래 모듈의 객체에 대한 참조가 있으면 이전 참조를 유지하고 매우 혼란스러운 일이 발생합니다.

따라서 모듈 a에 따라 모듈 bb변경 사항이있는 경우 'b를 다시로드'하고 'a를 다시로드하십시오'. 당신이 다시로드하는 경우 : 당신이 그 모듈이 동일한 패키지의 일부 때 매우 공통적 인 서로에 따라 두 개의 모듈을 가지고 있다면, 당신은 그들 모두를 다시로드 할 수 p.a는 이전에 대한 참조를 얻을 것이다 p.b, 그리고 그 반대로. 이를 수행하는 유일한 방법은 항목을 sys.modules다시 가져 오기 전에 에서 항목을 삭제하여 한 번에 모두 언로드하는 것입니다. 이것은 icky이며 실패한 상대 가져 오기 표식으로 None 인 모듈 항목과 관련하여 실질적인 함정이 있습니다.

또한 객체에 대한 참조를 시스템 모듈에 전달하는 모듈 (예 : 코덱을 등록하거나 경고 처리기를 추가하는 모듈)이 있으면 멈췄습니다. 나머지 Python 환경을 혼동하지 않으면 시스템 모듈을 다시로드 할 수 없습니다.

요약 : 하나의 독립형 스크립트에 의해 하나의 자체 포함 모듈이로드되는 가장 간단한 경우를 제외하고 reload()는 제대로 이해하기가 매우 까다 롭습니다. '패키지'를 사용하는 경우 인터프리터를 계속 사용하는 것이 좋습니다.


Python 3에서는 동작이 변경됩니다.

>>> import my_stuff

... my_stuff로 무언가를하고 나중에 :

>>>> import imp
>>>> imp.reload(my_stuff)

새로로드 된 my_stuff를 얻습니다.


몇 번이나 모듈을 가져 왔더라도 sys.modules처음에로드 된 동일한 모듈 사본을 얻을 수 있습니다.import mymodule

위 / 이전 답변 각각에 약간의 답변이 있으므로이 답변에 늦게 답변하므로 단일 답변으로 모두 요약하려고합니다.

내장 기능 사용 :

대한 파이썬 2.x에서 -를 사용하여 내장 reload(mymodule)기능.

대한 파이썬 3.x를 - 사용 imp.reload(mymodule).

들어 파이썬 3.4 - 파이썬 3.4 imp에 찬성 사용되지 않습니다 importlib즉,importlib.reload(mymodule)

몇 가지주의 사항 :

  • 일반적으로 내장 또는 동적으로로드 된 모듈을 다시로드하는 것은 그리 유용하지 않습니다. 다시로드 sys, __main__, builtins및 기타 주요 모듈하지 않는 것이 좋습니다.
  • 대부분의 경우 확장 모듈은 두 번 이상 초기화되도록 설계되지 않았으며 다시로드 할 때 임의의 방식으로 실패 할 수 있습니다. 다른 모듈에서 모듈 수입 개체를 사용하는 경우 from... import... 호출 reload()이 주위에 한 가지 방법은 재실행에있다 - 다른 모듈은 그것에서 수입 된 개체 다시 정의하지 않는 from다른 사용 성명 import(자격을 갖춘 이름 대신 module.name).
  • 모듈이 클래스의 인스턴스를 인스턴스화하는 경우 클래스를 정의하는 모듈을 다시로드해도 인스턴스의 메서드 정의에는 영향을 미치지 않습니다. 이전 클래스 정의는 계속 사용됩니다. 파생 클래스에 대해서도 마찬가지입니다.

외부 패키지 :

다시 가져 오기-다시 가져 오기는 현재 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

짧은 답변:

reimport : Python의 모든 기능을 갖춘 다시로드를 사용해보십시오 .

더 긴 답변 :

이 질문은 reimport 출시 전에 요청 / 응답 된 것으로 보입니다.이 명령 은 "Python의 모든 기능을 갖춘 새로 고침"으로 표시됩니다.

이 모듈은 파이썬의 리로드 기능을 완전히 대체 할 예정입니다. 장기 실행 응용 프로그램에서 사용되는 Python 플러그인 및 확장에 작동하는 다시로드를 목표로합니다.

Reimport는 현재 Python 2.4에서 2.6까지 지원합니다.

본질적으로 이것은 완전히 해결할 수있는 문제가 아닙니다. 이 모듈의 목표는 가장 일반적인 종류의 업데이트가 잘 작동하도록하는 것입니다. 또한 개별 모듈과 패키지가 프로세스를 지원할 수 있습니다. 발생 상황에 대한 자세한 설명은 개요 페이지에 있습니다.

참고 : reimport명시 적으로 Python 2.4에서 2.6을 지원 하지만 2.7에서 시도했지만 제대로 작동하는 것 같습니다.


이것이 모든 예상 작업을 수행하는지 확실하지 않지만 다음과 같이 할 수 있습니다.

>>> del mymodule
>>> import mymodule

종속 모듈을 다시로드하지 않는 방법과 그에 따른 영향에 대한 자세한 설명은 여기를 참조하십시오.

http://pyunit.sourceforge.net/notes/reloading.html

pyunit이 해결 한 방법은 __import__를 재정 의하여 종속 모듈을 추적 한 다음 sys.modules에서 각 모듈을 삭제하고 다시 가져 오는 것입니다. 그래도 다시로드했을 수 있습니다.


import sys
del sys.modules['module_name']

잠자리의 대답이 나를 위해 일했습니다 (파이썬 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



반응형