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

4 投票
1 回答
1461 浏览
提问于 2025-04-15 22:36

抱歉,我知道这个问题可能被问过很多次,但我找不到答案。

在我的 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,那么在很多方面你的生活会更简单(更容易重新加载只是其中之一;-)。

撰写回答