我有一个长期运行的 Python 服务器,并且希望能够在不重新启动服务器的情况下升级服务。这样做的最佳方法是什么?
if foo.py has changed: unimport foo <-- How do I do this? import foo myfoo = foo.Foo()
您可以使用以下命令重新加载已经导入的模块importlib.reload():
importlib.reload()
from importlib import reload # Python 3.4+ import foo while True: # Do some things. if is_changed(foo): foo = reload(foo)
在 Python 2 中,reload是内置的。在 Python 3 中,它被移到了imp模块中。在 3.4 中,imp已弃用,取而代之的是importlib. 以 3 或更高版本为目标时,在调用reload或导入时引用适当的模块。
reload
imp
importlib
我认为这就是你想要的。像 Django 的开发服务器这样的 Web 服务器使用它,这样您就可以看到代码更改的效果,而无需重新启动服务器进程本身。
引用文档:
Python 模块的代码被重新编译并重新执行模块级代码,通过重用最初加载模块的加载器定义一组新的对象,这些对象绑定到模块字典中的名称。init扩展模块的功能不会被第二次调用。 与 Python 中的所有其他对象一样,旧对象仅在其引用计数降至零后才会被回收。 模块命名空间中的名称被更新以指向任何新的或更改的对象。 对旧对象的其他引用(例如模块外部的名称)不会重新引用以引用新对象,并且如果需要,必须在它们出现的每个命名空间中进行更新。
init
正如您在问题中指出的那样,如果该类驻留在模块中,则必须重建Foo对象。Foo``foo
Foo
Foo``foo