파이썬 셸에서 클래스를 다시로드하는 방법?
패키지에 속하는 동일한 이름의 클래스를 정의하는 모듈을 가져 오면 부모 패키지의 __init__.py 때문에 모듈이 아닌 클래스로 가져옵니다. 자세한 내용 은 다른 디렉토리에서 다른 가져 오기 결과 를 참조하십시오. Python 셸 또는 ipython 셸에서
from MyPak import MyMod
MyModule은 항상 Class로 가져 오므로 다시로드 할 수 없습니다 (reload ()는 모듈에서만 작동 함). 운영
from MyPak import MyMod
다시 클래스 정의를 업데이트하지 않는 것 같습니다. 누구든지 파이썬 셸에서 클래스를 업데이트하는 방법을 제안 할 수 있습니까?
추신. 파이썬 인터프리터를 다시 시작하지 않고.
pps . 코드를 가지고 있고 테스트하고 싶은 경우를 대비해 : 실제로 BioPython에 대해 이야기하고 있으며 Bio.PDB.PDBParser에서 작업하고 있습니다. ipython 셸 (v0.10)이 있고 PDBParser.py를 편집합니다. ipython에서 다시로드 할 방법이 없습니다.
그래서 내가 한 일은 다음과 같습니다.
# start ipython v0.10
import Bio
from Bio.PDB import PDBParser
p = PDBParser()
s = p.get_structure()
# then I make changes,e.g. simply print some text, in PDBParser.py
del Bio
del PDBParser
del s
import Bio # or reload(Bio) without deleting all the objects
from Bio.PDB import PDBParser
p = PDBParser()
s = p.get_structure() # expected output after change not seen :(
인쇄 된 텍스트를 볼 수 없습니다. 변경 사항은 어떻게 든 적용되지 않았습니다.
Python 3에서만 reload
함수를 가져옵니다 .
>>> from importlib import reload
Python 2.x 및 3.x 모두 reload
에서 모듈 을 간단히 호출 할 수 있습니다 .
>>> import MyPak
>>> reload(MyPak)
>>> from MyPak import MyMod
그러나 이전 클래스의 인스턴스는 업데이트되지 않습니다 (업데이트 메커니즘을 설명하는 코드가 없습니다).
마침내 답을 찾았습니다.
import MyPak
from MyPak import MyMod
편집 한 후 MyPak/MyMod.py
파일을 클래스를 다시로드 MyMod
파일에 MyMod.py
, 하나 개의 요구를
import sys
del sys.modules['MyPak.MyMod']
reload(MyPak)
from MyPak import MyMod
주의 사항 :
실행
del MyPak
하거나del MyMod
또는del MyPak.MyMod
단순히 바인딩 이름을 제거하기 때문에 문제가 해결되지 않습니다. Pythonsys.modules
은 모듈을 이미 가져 왔는지 여부 만 검색 합니다. sys.modules 및 globals () 의 포스트 모듈 이름에서 토론을 확인하십시오 .MyPak을 다시로드 할 때 파이썬
from MyMod import MyMod
은MyPak/__init__.py
. 그러나, 그것은 발견MyPak.MyMod
에sys.modules
따라서는 것, NOT 다시MyMod
있지만MyPak/MyMod.py
업데이트되었습니다. 그리고 새로운MyPak/MyMod.pyc
것이 생성 되지 않는다는 것을 알게 될 것입니다 .
이 문제를 해결할 수있는 방법이 있습니다.
1. import MyPak.MyMod
대신 사용from MyPak import MyMod
그런 다음 다음과 같이 작성할 수 있습니다.
from importlib import reload # If on Python 3
import MyPak.MyMod
reload(MyPak.MyMod)
그리고 그것은 작동합니다.
2. IPython.lib.deepreload 사용
from MyPak import MyMod
from IPython.lib.deepreload import reload
reload(MyPak) # This should also reload all submodules
3. 자동 재 장전 마법 사용
%load_ext autoreload
%autoreload 2
import MyPak.MyMod # All changes to MyPak.MyMod will be loaded automatically
I have one myfile.py file which contains one class MyClass
To import just do:
from myfile import MyClass
mc = MyClass()
To reload:
import sys
del sys.modules['myfile']
from myfile import MyClass
modifiedmc = MyClass()
This is very useful while building modules. one can put these inside a function and just call the function
def myreload():
import sys
del sys.modules['myfile']
from myfile import MyClass
modifiedmc = MyClass()
global mc
mc = modifiedmc
You can use a magic function:
%load_ext autoreload
%autoreload 2
from MyPak import MyMod
It works for me using python 3.5.2:
import importlib
importlib.reload(class)
from class import module
참고URL : https://stackoverflow.com/questions/6946376/how-to-reload-a-class-in-python-shell
'Development Tip' 카테고리의 다른 글
자바 스크립트의 array.select () (0) | 2020.11.30 |
---|---|
else의 목적과 마지막으로 예외 처리 (0) | 2020.11.30 |
ggplot2에 대한 미학 테이블이나 카탈로그가 있습니까? (0) | 2020.11.30 |
Jenkins가 작업을 실행하지 않음 (보류 중-다음 실행기를 기다리는 중) (0) | 2020.11.30 |
--prefer-dist 플래그에도 불구하고 작성기 종속성의 느린 업데이트 (0) | 2020.11.30 |