首页 > 解决方案 > 如何在 Python 解释器中更新导入的脚本?

问题描述

我有一个正在调试的脚本。我已经使用以下方法导入了它:

import foo

然后我更新 foo. 在我再次执行“import foo”之后,什么都没有改变。如何在不需要存在解释器并重新输入的情况下更新它?此外,如果还有其他依赖它的包,我如何更新它们以使用最新版本?

标签: python

解决方案


使用importlib.reload(). 这曾经是一个内置函数(在 Python 2 中),但它并没有清理所有内容。这被认为太混乱了,它被转移到高级用户的 importlib 中。仔细阅读文档以了解原因。

>>> import foo
>>> from importlib import reload
>>> # do stuff
>>> reload(foo)

Python 中的模块缓存在sys.modules字典中。它们仅在第一次导入时从源加载。如果你在那里删除它,你可以获得类似的效果。

这两种方法的主要区别在于reload()保持相同的模块__dict__对象(它的全局对象),而只是从中删除它sys.modules不会。通常,如果您修改源,重新加载将用新定义覆盖这些全局变量。但是,如果您删除源中的定义,重新加载后旧版本仍然存在。在某些情况下,您实际上可以利用它来发挥自己的优势:如果您希望资源(如网络连接)在重新加载时保持不变,如果已经定义了全局,则可以编写其初始化以跳过该步骤。


推荐阅读