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