首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何卸载(重新加载) Python模块?

如何卸载(重新加载) Python模块?
EN

Stack Overflow用户
提问于 2009-01-13 08:33:36
回答 10查看 765.4K关注 0票数 958

我有一个长期运行的Python服务器,希望能够在不重新启动服务器的情况下升级服务。做这件事最好的方法是什么?

代码语言:javascript
复制
if foo.py has changed:
    unimport foo  <-- How do I do this?
    import foo
    myfoo = foo.Foo()
EN

回答 10

Stack Overflow用户

发布于 2009-01-13 12:53:26

reload(module),但前提是它是完全独立的。如果有任何其他东西引用了模块(或属于该模块的任何对象),那么您将得到一些微妙而奇怪的错误,这些错误是由于旧代码存在的时间比您预期的要长,以及像isinstance这样的东西不能跨相同代码的不同版本工作。

如果您具有单向依赖项,则还必须重新加载依赖于重新加载的模块的所有模块,以消除对旧代码的所有引用。然后递归地重新加载依赖于重新加载的模块的模块。

如果你有循环依赖,这是非常常见的,例如,当你处理重新加载一个包时,你必须一次性卸载组中的所有模块。您不能使用reload()做到这一点,因为它将在每个模块的依赖项被刷新之前重新导入每个模块,从而允许旧引用悄悄进入新模块。

在这种情况下,唯一的方法是破解sys.modules,这是一种不受支持的方法。您必须遍历并删除希望在下一次导入时重新加载的每个sys.modules条目,还必须删除其值为None的条目,以处理与缓存失败的相对导入有关的实现问题。它不是非常好,但只要你有一个完全自包含的依赖集,不会把引用留在它的代码库之外,它就是可行的。

最好是重新启动服务器。:-)

票数 88
EN

Stack Overflow用户

发布于 2010-07-07 19:44:10

代码语言:javascript
复制
if 'myModule' in sys.modules:  
    del sys.modules["myModule"]
票数 68
EN

Stack Overflow用户

发布于 2012-11-21 00:01:09

以下代码支持Python 2/3兼容性:

代码语言:javascript
复制
try:
    reload
except NameError:
    # Python 3
    from imp import reload

在这两个版本中,你都可以使用它作为reload(),这使得事情变得更简单。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/437589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档