Jupyter notebook导入本地Python文件修改后重新加载不生效问题
问题原因
你的推测完全正确,该问题是Python内置的模块缓存机制导致的:
- Python解释器首次导入任意模块时,会把模块的完整内容加载到内存中缓存,后续所有
import、from ... import ...语句都会直接复用内存中的缓存对象,不会重新读取磁盘上的最新源文件。 - Jupyter notebook的内核是持续运行的Python进程,只要内核不重启,首次导入
functions生成的缓存就会一直留存。你修改源文件后重新执行导入单元格,也不会更新缓存的模块内容,新增的composition函数自然不存在于缓存中,就会触发NameError。 - 重启内核相当于销毁旧的Python进程、启动新进程,旧缓存全部清空,重新导入时就会读取最新的
functions.py内容,所以代码可以正常运行。
无需重启内核的解决方法
方法1:手动重载模块
可以通过Python标准库importlib强制重载模块,修改完源文件后重新执行导入单元格即可生效:
import importlib import functions # 强制重载最新的模块内容 importlib.reload(functions) from functions import *
方法2:开启Jupyter自动重载(推荐)
在notebook最开头添加两行IPython魔法命令,开启自动重载功能后,你修改源文件并保存后,运行代码会自动读取最新内容,无需手动重载也不用重启内核:
%load_ext autoreload %autoreload 2
内容的提问来源于stack exchange,提问作者brat_vseznamus
相关产品推荐
相关产品推荐

