Python中重新加载依赖模块

5

假设我有一个导入othermodule.py的Python脚本main.py。是否可以在main.py中编写reload(othermodule),以便当我对othermodule.py进行更改时,仍然可以只使用reload(main),这将重新加载othermodule


我认为重新加载主文件是一个非常大的错误... - Bakuriu
如果您想要执行reload(main)(正如@Bakuriu所说不是一个好主意),这并不会默认执行reload(othermodule)。您在这里想要实现什么?自动重新加载任何已更改的模块吗? - Aya
是的,抱歉我可能没有解释清楚,但我只是试图找出在大多数主要代码位于main.py中并在解释器中导入它的情况下重新加载模块的最佳方法,但main.py导入othermodule.py,而我可能会更改它。 - rottentomato56
2个回答

4

好的,事情并不是那么简单。假设你有一个像下面这样的main.py文件...

import time
import othermodule

foo = othermodule.Foo()
while 1:
    foo.foo()
    time.sleep(5)
    reload(othermodule)

...还有一个像这样的othermodule.py...

class Foo(object):
    def foo(self):
        print 'foo'

...然后,如果你将othermodule.py更改为以下内容...

class Foo(object):
    def foo(self):
        print 'bar'

虽然 main.py 仍在运行时,它将继续打印 foo 而不是 bar,因为 main.py 中的 foo 实例将继续使用旧的类定义,但你可以通过将 main.py 设计成这样来避免这种情况...

import time
import othermodule

while 1:
    foo = othermodule.Foo()
    foo.foo()
    time.sleep(5)
    reload(othermodule)

重点是,你需要了解导入的模块发生哪些更改会在重新加载(reload())时引起问题。最好在原始问题中包含一些源代码,但在大多数情况下,最安全的做法可能是重启整个脚本。

谢谢,你的代码示例很有意义。我最初想问的部分是关于你最后一段代码中的reload(othermodule)。所以如果我在解释器中更改了othermodule.py并重新加载了main,它是否也会重新加载othermodule并提交更改? - rottentomato56
1
@rottentomato56 取决于 main.py 的内容。假设前两行是 import othermodulereload(othermodule),那么 reload(main) 应该可以工作,但根据实际代码可能会有复杂情况。 - Aya
最保险的做法可能是重新启动整个脚本。如果这是一个服务器,我能不能比使用subprocess并通过stdin / stdout通信启动Python脚本做得更好呢? - user3064538

1

你是否觉得Python已经有了reload(),这不够好吗?

从你的评论来看,似乎你对ipython中的deep reload函数很感兴趣,但我建议使用时要谨慎。


哦,reload() 函数也可以处理主脚本中导入的模块吗? - rottentomato56
2
@rottentomato56,reload并不是简单地在sys.modules中“销毁”模块对象,然后重新导入它。如果该模块导入了其他模块,则不会重新导入第二个模块,因为它已经存在于sys.module中。 - Bakuriu
谢谢建议,我会进一步研究。 - rottentomato56

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接