Python-如何卸载(重新加载)模块?
我有一台运行时间较长的Python服务器,并且希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么?
if foo.py has changed: unimport foo <-- How do I do this?
import foo
myfoo = foo.Foo()
回答:
你可以使用reload内置函数重新加载已导入的模块:
from importlib import reload # Python 3.4+ only.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或导入时参考相应的模块。
我认为这就是你想要的。诸如Django开发服务器之类的Web服务器都使用此服务器,这样你就可以看到代码更改的效果,而无需重新启动服务器进程本身。
引用文档:
重新编译Python模块的代码并重新执行模块级代码,从而定义了一组新对象,这些对象绑定到模块字典中的名称。扩展模块的init
函数不会被第二次调用。与Python中的所有其他对象一样,旧对象仅在其引用计数降至零后才被回收。模块名称空间中的名称将更新为指向任何新的或更改的对象。对旧对象的其他引用(例如模块外部的名称)不会反弹以引用新对象,并且如果需要的话,必须在出现它们的每个命名空间中进行更新。
正如你在问题中指出的那样,Foo
如果Foo
类驻留在foo
模块中,则必须重构对象。
以上是 Python-如何卸载(重新加载)模块? 的全部内容, 来源链接: utcz.com/qa/421642.html