source

대화형 모듈 재 Import

goodcode 2022. 11. 5. 11:41
반응형

대화형 모듈 재 Import

모듈을 재 Import하려면 어떻게 해야 하나요?.py 파일을 변경한 후 모듈을 다시 가져오고 싶습니다.

Python 3.4+의 경우:

import importlib
importlib.reload(nameOfModule)

Python < 3.4의 경우:

reload(my.module)

Python 문서에서

이전에 Import한 모듈을 새로고침합니다.인수는 모듈개체여야 하므로 이전에 정상적으로 Import된 적이 있어야 합니다.외부 에디터를 사용하여 모듈소스 파일을 편집하여 Python 인터프리터를 떠나지 않고 새로운 버전을 시험해 보고 싶을 때 유용합니다.

이 방법을 사용할 때의 주의사항을 잊지 마십시오.

  • 모듈을 새로고침하면 모듈의 글로벌 변수를 포함하는 사전이 유지됩니다.이름을 재정의하면 오래된 정의가 덮어쓰기 때문에 일반적으로 이것은 문제가 되지 않지만 새 버전의 모듈이 이전 버전에서 정의한 이름을 정의하지 않으면 오래된 정의는 삭제되지 않습니다.

  • 모듈이 다른 모듈에서 개체를 Import하는 경우from ... import ...,부르기reload()다른 모듈에서는 Import된 오브젝트를 재정의하지 않습니다.이 문제를 회피하기 위한 한 가지 방법은,from스테이트먼트, 또 다른 방법은import및 정규화된 이름(module.*name*)을 클릭합니다.

  • 모듈이 클래스의 인스턴스를 인스턴스화한 경우 클래스를 정의하는 모듈을 새로고침해도 인스턴스의 메서드 정의에 영향을 주지 않습니다.클래스 정의는 계속 사용됩니다.파생 클래스도 마찬가지입니다.

python 3에서는reload더 이상 내장 기능이 아닙니다.

python 3.4+ 를 사용하고 있는 경우는, 대신에 라이브러리에서 다음의 것을 사용해 주세요.

import importlib
importlib.reload(some_module)

python 3.2 또는 3.3을 사용하는 경우 다음을 수행해야 합니다.

import imp  
imp.reload(module)  

대신.http://docs.python.org/3.0/library/imp.html#imp.reload 를 참조해 주세요.

를 사용하고 있는 경우는, 다음의 내선 번호의 사용을 검토해 주세요.

%load_ext autoreload
%autoreload 2

사실 Python 3에서 모듈은imp는 DEFECUREED로 마크되어 있습니다.음, 적어도 3.4는 해당됩니다.

그 대신reload에서 기능하다importlib모듈을 사용해야 합니다.

https://docs.python.org/3/library/importlib.html#importlib.reload

그러나 이 라이브러리는 마지막 두 개의 마이너 버전에서 API가 일부 변경되었음을 유의하십시오.

모듈에서 특정 함수 또는 클래스를 Import하는 경우 다음을 수행할 수 있습니다.

import importlib
import sys
importlib.reload(sys.modules['my_module'])
from my_module import my_function

또 다른 작은 점:를 사용했을 경우import some_module as sm에일리어스 이름을 사용하여 모듈을 새로고침해야 합니다(sm이 예에서는, 다음과 같이 됩니다.

>>> import some_module as sm
...
>>> import importlib
>>> importlib.reload(some_module) # raises "NameError: name 'some_module' is not defined"
>>> importlib.reload(sm) # works

제공된 답변은 특정 모듈에서 동작하지만 이 답변에서 설명한 와 같이 서브모듈은 새로고침되지 않습니다.

이 "Import"를 사용하여 에서 개체를 Import하는 from ... import ..., 호출, 호출reload()문을 하거나 Import를 사용하는 .이러한 방법으로 from 스테이트먼트를 재작성하고 다른 모듈을 사용하여import수식명)module.*name*을 클릭합니다을 클릭합니다.

, 를 는, 「 」__all__API를 정의할 수 .public variable은 합니다.

# Python >= 3.5
import importlib
import types


def walk_reload(module: types.ModuleType) -> None:
    if hasattr(module, "__all__"):
        for submodule_name in module.__all__:
            walk_reload(getattr(module, submodule_name))
    importlib.reload(module)


walk_reload(my_module)

그러나 이전 답변에서 언급된 경고는 여전히 유효합니다.특히의 에 따라 .__all__변수는 이 함수를 사용한 새로고침의 영향을 받지 않습니다.마찬가지로 서브모듈의 요소를 삭제해도 새로고침에는 반영되지 않습니다.

import sys

del sys.modules['module_name']
import module_name

언급URL : https://stackoverflow.com/questions/1254370/reimport-a-module-while-interactive

반응형