Development Tip

파이썬 셸에서 클래스를 다시로드하는 방법?

yourdevel 2020. 11. 30. 20:06
반응형

파이썬 셸에서 클래스를 다시로드하는 방법?


패키지에 속하는 동일한 이름의 클래스를 정의하는 모듈을 가져 오면 부모 패키지의 __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

주의 사항 :

  1. 실행 del MyPak하거나 del MyMod또는 del MyPak.MyMod단순히 바인딩 이름을 제거하기 때문에 문제가 해결되지 않습니다. Python sys.modules은 모듈을 이미 가져 왔는지 여부 만 검색 합니다. sys.modules 및 globals () 의 포스트 모듈 이름에서 토론을 확인하십시오 .

  2. MyPak을 다시로드 할 때 파이썬 from MyMod import MyModMyPak/__init__.py. 그러나, 그것은 발견 MyPak.MyModsys.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

반응형