重新加载模块,需要重新编译子模块吗?
抱歉,我知道这个问题可能被问过很多次,但我找不到答案。
在我的 myModule.py 文件里:
from myModule.subModule import myClass
我正在开发 myClass,并想在我的 ipython 会话中测试它。可是,使用 reload(myModule)
并不能重新编译 myClass。
我该怎么做呢?
1 个回答
2
在重新加载最里面的子模块后,你需要重新导入你的模块。比如,假设你有:
$ mkdir myModule
$ touch myModule/__init__.py
$ cat >myModule/subModule.py
class MyClass(object): kind='first'
然后
>>> from myModule.subModule import MyClass
>>> MyClass.kind
'first'
在另一个终端中
$ cat >myModule/subModule.py
class MyClass(object): kind='second'
然后...:
>>> import sys
>>> reload(sys.modules['myModule.subModule'])
<module 'myModule.subModule' from 'myModule/subModule.py'>
>>> from myModule.subModule import MyClass
>>> MyClass.kind
'second'
你需要通过 sys.modules
来访问,因为否则你没有子模块的引用,然后你需要重复使用 from
。
如果你接受一个明智的建议,总是导入整个模块,而不是只导入模块内部的东西,生活会简单很多。比如,Python会话会是(在重新加载之前对子模块进行了更改):
>>> from myModule import subModule as sm
>>> sm.MyClass.kind
'first'
>>> reload(sm)
<module 'myModule.subModule' from 'myModule/subModule.py'>
>>> sm.MyClass.kind
'second'
如果你养成使用带有前缀的名称,比如 sm.MyClass
,而不是仅仅使用 MyClass
,那么在很多方面你的生活会更简单(更容易重新加载只是其中之一;-)。