python - 如何在 Python 解释器中更新导入的脚本?
问题描述
我有一个正在调试的脚本。我已经使用以下方法导入了它:
import foo
然后我更新 foo. 在我再次执行“import foo”之后,什么都没有改变。如何在不需要存在解释器并重新输入的情况下更新它?此外,如果还有其他依赖它的包,我如何更新它们以使用最新版本?
解决方案
使用importlib.reload()
. 这曾经是一个内置函数(在 Python 2 中),但它并没有清理所有内容。这被认为太混乱了,它被转移到高级用户的 importlib 中。仔细阅读文档以了解原因。
>>> import foo
>>> from importlib import reload
>>> # do stuff
>>> reload(foo)
Python 中的模块缓存在sys.modules
字典中。它们仅在第一次导入时从源加载。如果你在那里删除它,你可以获得类似的效果。
这两种方法的主要区别在于reload()
保持相同的模块__dict__
对象(它的全局对象),而只是从中删除它sys.modules
不会。通常,如果您修改源,重新加载将用新定义覆盖这些全局变量。但是,如果您删除源中的定义,重新加载后旧版本仍然存在。在某些情况下,您实际上可以利用它来发挥自己的优势:如果您希望资源(如网络连接)在重新加载时保持不变,如果已经定义了全局,则可以编写其初始化以跳过该步骤。
推荐阅读
- android - 活动显示与方向变化的片段重叠
- php - 如何解决:无法连接到 www.google.com:443 。错误 #0:stream_socket_client():无法连接到 www.google.com:443(没有到主机的路由)
- javascript - 2019 年是否有原生方式在 Javascript 中执行延迟承诺?
- swift - 是否可以在 Swift 中设置一个接受多种类型的变量?
- django - 如何在我的视图中将 DateTime 字段输出为毫秒?
- matplotlib - 如何将颜色图分配给 matplotlib 图形动画?
- regex - nginx如果不是正则表达式怎么办
- cakephp - 在cakephp中选择的订单条件中的日期格式
- javascript - Chrome 正在破坏我在触摸屏上的 Web 应用程序设计
- python - python的情节和破折号的依赖性问题