当前位置: 首页 > 面试题库 >

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

卫博学
2023-03-14
问题内容

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

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

问题答案:

您可以使用reload内置函数(仅适用于Python 3.4+)重新导入已导入的模块:

from importlib import reload  
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服务器,并且希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么? 问题答案: 你可以使用reload内置函数重新加载已导入的模块: 在Python 3中,已移至imp模块。在3.4中,不推荐使用importlib,而在中添加了。当定位到3或更高版本时,在调用reload或导入时参考相应的模块。 我认为这就是你想要的。诸如Django开发服务器

  • 问题内容: TL / DR: 更新 我已经就此问题与Python开发人员联系,实际上,“在未来五年内”不可能完全卸载模块。(请参阅链接) 请接受,在2.x中,Python确实不支持针对严重,根本,不可克服的技术问题的卸载模块。 在我最近一次寻找应用程序内存泄漏的过程中,我将其范围缩小到模块,即我无法 垃圾收集 已卸载的模块。使用下面列出的 任何 方法卸载模块都会在内存中保留数千个对象。换句话说-我

  • 了解如何创建和管理插件。 创建插件 选择“插件”>“开发”>“创建插件”,该菜单将引导您进入 Adobe I/O 开发者控制台。 有关更多创建、测试、提交插件的入门信息,请参阅 Adobe XD 开发者文档。创建插件 查看和安装插件 要查看可安装的插件,请选择“插件”>“发现插件”,或者单击工具栏上的“插件”图标。此外,单击“发现插件 (+)”图标启动“插件管理器”。 查看和安装插件 在插件管理器

  • 我知道如何加载CSS。 怎么卸载?

  • 问题内容: 跟进有关重新加载模块的问题,如何从已更改的模块重新加载特定功能? 伪代码: 问题答案: 您想要的是可能的,但是需要重新加载两件事……首先,但是您还必须这样做(假设是包含该语句的模块的名称)。 至于为什么…第一次加载时,将创建一个对象,其中包含一个对象。当您导入到模块,它存储到一个参考。当被调用时,对象被消隐,并且该模块重新执行。这意味着所有引用仍然有效,但是已经创建了一个新对象…因此,

  • 问题内容: 这是一个非常基本的问题-但我无法通过在线搜索找到答案。 我正在使用python控制ArcGIS,并且有一个简单的python脚本,该脚本调用了一些预先编写的代码。 但是,当我对预写代码进行更改时,它似乎没有导致任何更改。我导入了此模块,并尝试刷新它,但是没有任何反应。 我什至将它调用的文件移到了另一个位置,脚本仍然可以正常工作。昨天我做的一件事是我将所有python文件都添加到sys路