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

发布于 2021-02-02 23:24:00

我有一台运行时间较长的Python服务器,并且希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么?

if foo.py has changed:
    unimport foo  <-- How do I do this?
    import foo
    myfoo = foo.Foo()
关注者
0
被浏览
269
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    你可以使用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模块中,则必须重构对象。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看