python – 重装模块,需要重新编译子模块吗?

对不起,我确定这是一堆,但我找不到.

在myModule.py中:

from myModule.subModule import myClass

我正在研究myClass,并希望留在我的ipython会话中进行测试. reload(myModule)不会重新编译myClass.

我怎样才能做到这一点?

最佳答案 重新加载“leafmost”子模块后,需要重复导入.例如,给出:

$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,因为你没有对子模块的引用,然后你需要重复从.

如果你接受总是导入模块的明智建议,那么生活就会简单得多,当然也不会从INSIDE模块中获取内容 – 例如,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,那么你的生活在很多方面会更简单(更容易重新加载只是其中之一;-).

点赞