如果导入定义属于包的同名类的模块,则该模块将作为类而不是模块导入,因为父包的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 :(
我看不到印刷文本。这些改变并没有以某种方式应用。
仅在Python 3上,导入^{} 函数:
在Python 2.x和3.x上,只需调用模块上的
reload
:但是,旧类的实例不会被更新(没有描述更新机制的代码)。
有几种方法可以解决这个问题:
一。使用
import MyPak.MyMod
而不是from MyPak import MyMod
然后你可以写:
而且有效。
2。使用IPython.lib.deepreload
三。使用autoreload魔法
我终于找到了答案:
编辑
MyPak/MyMod.py
文件后,要在文件MyMod.py
中重新加载类MyMod
,需要注意事项:
执行
del MyPak
或del MyMod
或del MyPak.MyMod
并不能解决问题,因为它只是删除名称绑定。Python只搜索sys.modules
以查看模块是否已经导入。查看文章module name in sys.modules and globals()中的讨论。重新加载MyPak时,python尝试执行
MyPak/__init__.py
中的from MyMod import MyMod
行。但是,它在sys.modules
中找到MyPak.MyMod
,因此它不会 重新加载MyMod
,尽管MyPak/MyMod.py
已更新。你会发现没有新的MyPak/MyMod.pyc
生成。相关问题 更多 >
编程相关推荐