在Python中重新加载依赖模块

在Python中重新加载依赖模块,python,reload,python-module,Python,Reload,Python Module,假设我有一个Python脚本main.py,它导入了othermodule.py。是否可以在main.py中编写一个reload(othermodule),这样当我对othermodule.py进行更改时,我仍然可以reload(main),然后重新加载othermodule?

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


从您的评论中,听起来您可能对
ipython
中的函数感兴趣,尽管我会谨慎使用它。

嗯,它并没有那么简单。假设您有一个像这样的
main.py

import time
import othermodule

foo = othermodule.Foo()
while 1:
    foo.foo()
    time.sleep(5)
    reload(othermodule)
class Foo(object):
    def foo(self):
        print 'foo'
import time
import othermodule

while 1:
    foo = othermodule.Foo()
    foo.foo()
    time.sleep(5)
    reload(othermodule)
…和这样的
othermodule.py

import time
import othermodule

foo = othermodule.Foo()
while 1:
    foo.foo()
    time.sleep(5)
    reload(othermodule)
class Foo(object):
    def foo(self):
        print 'foo'
import time
import othermodule

while 1:
    foo = othermodule.Foo()
    foo.foo()
    time.sleep(5)
    reload(othermodule)
…然后如果将
othermodule.py
更改为此

class Foo(object):
    def foo(self):
        print 'bar'
…当
main.py
仍在运行时,它将继续打印
foo
,而不是
bar
,因为
main.py
中的
foo
实例将继续使用旧的类定义,尽管您可以通过如下方式避免这一点

import time
import othermodule

foo = othermodule.Foo()
while 1:
    foo.foo()
    time.sleep(5)
    reload(othermodule)
class Foo(object):
    def foo(self):
        print 'foo'
import time
import othermodule

while 1:
    foo = othermodule.Foo()
    foo.foo()
    time.sleep(5)
    reload(othermodule)
关键是,您需要了解导入模块的各种更改,这些更改将在
重新加载()时导致问题


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

我认为
重新加载
主文件是一个非常大的错误……如果您
重新加载(main)
(@Bakuriu正确地说这是一个坏主意),则不会
重新加载(其他模块)
默认情况下。您想在这里实现什么?自动重新加载任何更改的模块?是的,很抱歉,我可能没有很好地解释这一点,但我只是想找出在大多数主代码都是main.py的情况下重新加载模块的最佳方法,我在解释器中导入了main.py,但main.py导入了othermodule.py,我不知道t change.Oh,reload()是否也处理主脚本中导入的模块?@rottentomoto56 No.
reload
只是“销毁”在
sys.modules
中创建模块对象,然后重新导入它。如果此模块导入其他模块,则不会重新导入第二个模块,因为它已存在于
sys.module
中。感谢您的建议,我将对此进行更多研究。谢谢,您的代码示例很有意义。我最初试图询问的部分是我n关于最后一个代码段中的
reload(othermodule)
。因此,如果在更改othermodule.py后在解释器中我
reload(main)
,它还会
reload(othermodule)吗
并提交更改?@rottentomoto56取决于
main.py
的内容。假设前两行是
import othermodule
reload(othermodule)
,则
reload(main)
应该可以工作,但可能会有复杂的情况,具体取决于实际的代码。“重新启动整个脚本可能是最安全的”如果这是一个服务器怎么办?我能做比使用
子进程启动Python脚本
并通过stdin/stdout进行通信更好的事情吗?