如何在python shell中重新加载类?

2024-06-17 16:23:09 发布

您现在位置:Python中文网/ 问答频道 /正文

如果导入定义属于包的同名类的模块,则该模块将作为类而不是模块导入,因为父包的init.py。有关详细信息,请参见different import results at different directories。在Python shell或ipythonshell中,如果我这样做了

from MyPak import MyMod

MyModule总是作为类导入,因此我无法重新加载它(reload()仅适用于模块)。跑步

from MyPak import MyMod

似乎再次没有更新类定义。有人能建议一种在python shell中更新类的方法吗?

不需要重新启动python解释器。

pps。以防万一你手头有代码,想测试一下:我实际上是在谈论BioPython,我正在研究Bio.PDB.PDBParser。我有一个ipython shell(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 :(

我看不到印刷文本。这些改变并没有以某种方式应用。


Tags: 模块frompyimport定义ipythonshellreload
3条回答

仅在Python 3上,导入^{}函数:

>>> from importlib import reload

在Python 2.x和3.x上,只需调用模块上的reload

>>> import MyPak
>>> reload(MyPak)
>>> from MyPak import MyMod

但是,旧类的实例不会被更新(没有描述更新机制的代码)。

有几种方法可以解决这个问题:

一。使用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

三。使用autoreload魔法

%load_ext autoreload
%autoreload 2
import MyPak.MyMod  # All changes to MyPak.MyMod will be loaded automatically

我终于找到了答案:

import MyPak
from MyPak import MyMod

编辑MyPak/MyMod.py文件后,要在文件MyMod.py中重新加载类MyMod,需要

import sys
del sys.modules['MyPak.MyMod'] 
reload(MyPak)
from MyPak import MyMod

注意事项:

  1. 执行del MyPakdel MyModdel MyPak.MyMod并不能解决问题,因为它只是删除名称绑定。Python只搜索sys.modules以查看模块是否已经导入。查看文章module name in sys.modules and globals()中的讨论。

  2. 重新加载MyPak时,python尝试执行MyPak/__init__.py中的from MyMod import MyMod行。但是,它在sys.modules中找到MyPak.MyMod,因此它不会 重新加载MyMod,尽管MyPak/MyMod.py已更新。你会发现没有新的MyPak/MyMod.pyc生成。

相关问题 更多 >