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

时间:2010-05-11 21:31:31

标签: python

抱歉,我确定这是一堆,但我找不到。

myModule.py中的

from myModule.subModule import myClass

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

我该怎么做?

1 个答案:

答案 0 :(得分:2)

重新加载“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,因为您没有引用子模块,然后您需要重复from

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