小编典典

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

all

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

if foo.py has changed:
    unimport foo  <-- How do I do this?
    import foo
    myfoo = foo.Foo()

阅读 169

收藏
2022-02-28

共1个答案

小编典典

您可以使用以下命令重新加载已经导入的模块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或导入时引用适当的模块。

我认为这就是你想要的。像 Django 的开发服务器这样的 Web 服务器使用它,这样您就可以看到代码更改的效果,而无需重新启动服务器进程本身。

引用文档:

  • Python
    模块的代码被重新编译并重新执行模块级代码,通过重用最初加载模块的加载器定义一组新的对象,这些对象绑定到模块字典中的名称。init扩展模块的功能不会被第二次调用。
  • 与 Python 中的所有其他对象一样,旧对象仅在其引用计数降至零后才会被回收。
  • 模块命名空间中的名称被更新以指向任何新的或更改的对象。
  • 对旧对象的其他引用(例如模块外部的名称)不会重新引用以引用新对象,并且如果需要,必须在它们出现的每个命名空间中进行更新。

正如您在问题中指出的那样,如果该类驻留在模块中,则必须重建Foo对象。Foo``foo

2022-02-28