【问题标题】:reloading dependent modules in Python在 Python 中重新加载依赖模块
【发布时间】:2013-05-16 12:27:24
【问题描述】:

假设我有一个导入 othermodule.py 的 Python 脚本 main.py。是否可以在main.py 中写一个reload(othermodule),这样当我对othermodule.py 进行更改时,我仍然可以只使用reload(main),然后它会重新加载其他模块?

【问题讨论】:

  • 我相信reloading main 文件是一个很大的错误......
  • 如果你是reload(main)(@Bakuriu 正确地说这是一个坏主意),默认情况下不会reload(othermodule)。你想在这里实现什么?自动重新加载任何更改的模块?
  • 是的,对不起,我可能没有很好地解释这一点,但我只是想找出在我的大部分主要代码都在 main 中的情况下重新加载模块的最佳方法.py 我在解释器中导入,但 main.py 导入 othermodule.py,我可能会更改。

标签: python reload python-module


【解决方案1】:

Python 已经有 reload() 还不够好吗?

从您的 cmets 看来,您可能对 ipython 中的 deep reload 函数感兴趣,尽管我会谨慎使用它。

【讨论】:

  • 哦,reload() 是否也处理主脚本中的导入模块?
  • @rottentomato56 No.reload 简单地“销毁”sys.modules 中的模块对象,然后重新导入它。如果此模块导入其他模块,则不会重新导入第二个模块,因为它已经存在于 sys.module 中。
  • 感谢您的建议,我会进一步研究。
【解决方案2】:

嗯,事情没那么简单。假设您有这样的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() 出现问题。

在原始问题中包含一些源代码可能会有所帮助,但在大多数情况下,重新启动整个脚本可能是最安全的。

【讨论】:

  • 谢谢,您的代码示例很有意义。我最初试图询问的部分是关于您拥有的最后一个 sn-p 中的reload(othermodule)。因此,如果我在更改othermodule.py 后在解释器中reload(main),它是否也会reload(othermodule) 并提交更改?
  • @rottentomato56 取决于main.py 的内容。假设前两行是import othermodulereload(othermodule),那么reload(main) 应该可以工作,但可能会出现复杂情况,具体取决于实际代码。
  • “重新启动整个脚本可能是最安全的”如果这是一个服务器怎么办?除了使用subprocess 启动 Python 脚本并通过 stdin/stdout 进行通信之外,我还能做些什么吗?
猜你喜欢
  • 2012-10-19
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
相关资源
最近更新 更多