Python中修改模块函数后如何覆盖已导入的模块?
问题:修改模块函数后重新导入仍输出旧结果,如何获取更新后的功能?
先还原一下你的场景:
初始的a.py:
def number(value): return value+1
初始的main.py:
import a print(a.number(0)) # 输出1
修改a.py为:
def number(value): return value+2
但再次运行main.py(或者在同一个会话里重新导入),输出还是1,这可太让人困惑了!
原因
这是因为Python为了提升效率,会缓存已经导入过的模块——第一次导入a的时候,它就被加载到内存里了,后续再执行import a,Python只会直接用内存里的旧版本,不会重新去读磁盘上的新文件。
解决办法
给你三种实用的解决方案,按需选:
方法一:用
importlib.reload()强制重载模块
如果你是在交互式环境(比如Python Shell、Jupyter Notebook)里,不想重启会话的话,就用这个方法:import a import importlib # 强制重新加载修改后的a.py importlib.reload(a) print(a.number(0)) # 现在会输出2小提醒:如果你的模块依赖其他模块,可能需要连带重载依赖,但你的场景很简单,直接reload就行。
方法二:重启Python解释器
最直接粗暴的方式——关掉当前运行的Python进程(比如终端里的程序、IDE的运行窗口),然后重新运行main.py。这时候解释器会从头开始,重新读取磁盘上最新的a.py,自然就能用到修改后的函数了。方法三:每次运行脚本都用全新进程
如果你是写脚本运行,只要每次修改后,在终端里重新执行python main.py,而不是在同一个交互式会话里重复跑代码,就不会有缓存问题——因为每次执行都是一个全新的Python进程,会重新加载所有模块。
内容的提问来源于stack exchange,提问作者zest16
相关产品推荐
相关产品推荐

