我有一个长期运行的Python服务器,希望能够在不重新启动服务器的情况下升级服务。做这件事最好的方法是什么?
if foo.py has changed:
unimport foo <-- How do I do this?
import foo
myfoo = foo.Foo()
发布于 2009-01-13 12:53:26
reload(module)
,但前提是它是完全独立的。如果有任何其他东西引用了模块(或属于该模块的任何对象),那么您将得到一些微妙而奇怪的错误,这些错误是由于旧代码存在的时间比您预期的要长,以及像isinstance
这样的东西不能跨相同代码的不同版本工作。
如果您具有单向依赖项,则还必须重新加载依赖于重新加载的模块的所有模块,以消除对旧代码的所有引用。然后递归地重新加载依赖于重新加载的模块的模块。
如果你有循环依赖,这是非常常见的,例如,当你处理重新加载一个包时,你必须一次性卸载组中的所有模块。您不能使用reload()
做到这一点,因为它将在每个模块的依赖项被刷新之前重新导入每个模块,从而允许旧引用悄悄进入新模块。
在这种情况下,唯一的方法是破解sys.modules
,这是一种不受支持的方法。您必须遍历并删除希望在下一次导入时重新加载的每个sys.modules
条目,还必须删除其值为None
的条目,以处理与缓存失败的相对导入有关的实现问题。它不是非常好,但只要你有一个完全自包含的依赖集,不会把引用留在它的代码库之外,它就是可行的。
最好是重新启动服务器。:-)
发布于 2010-07-07 19:44:10
if 'myModule' in sys.modules:
del sys.modules["myModule"]
发布于 2012-11-21 00:01:09
以下代码支持Python 2/3兼容性:
try:
reload
except NameError:
# Python 3
from imp import reload
在这两个版本中,你都可以使用它作为reload()
,这使得事情变得更简单。
https://stackoverflow.com/questions/437589
复制相似问题