如何在Python解释器中更新导入的脚本?

如何在Python解释器中更新导入的脚本?,python,Python,我有一个正在调试的脚本。我已使用以下方法导入它: import foo 然后我更新foo。在我再次执行“导入foo”之后,没有任何更改。如何在不需要解释器存在和重新输入的情况下更新它?此外,如果有其他依赖它的软件包,如何更新它们以使用最新版本?使用importlib.reload()。这曾经是一个内置的(在Python 2中),但它并没有清理所有东西。这被认为太令人困惑了,它被移动到importlib供高级用户使用。仔细阅读文章,了解原因 >>> import foo >

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

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

使用
importlib.reload()
。这曾经是一个内置的(在Python 2中),但它并没有清理所有东西。这被认为太令人困惑了,它被移动到importlib供高级用户使用。仔细阅读文章,了解原因

>>> import foo
>>> from importlib import reload
>>> # do stuff
>>> reload(foo)
Python中的模块缓存在
sys.Modules
dict中。它们仅在第一次导入时从源代码加载。如果你在那里删除它,你可以得到类似的效果

这两种方法之间的主要区别在于
reload()
保留相同的模块
\uuuu dict\uuuu
对象(其全局),而仅从
sys中删除它。模块
不会。通常,如果修改源,重新加载将用新定义覆盖这些全局变量。但如果删除源中的定义,重新加载后旧版本仍将存在。实际上,在某些情况下,您可以利用这一点:如果您希望资源(如网络连接)在重新加载时保持不变,则可以编写其初始化,以便在全局已定义的情况下跳过该步骤