%load 是将.py文件内容复制到当前cell但不执行,需手动运行;路径须相对notebook目录,不支持通配符;与%run(直接执行)本质区别在于是否允许编辑调试。

%load 会把代码复制进当前 cell,但不会自动执行
很多人以为 %load 是“运行”脚本,其实它只是把 .py 文件内容原样塞进当前 cell 里,还自动把这行命令注释掉。你得手动再 Run 一次 cell 才真正执行。
常见错误现象:%load utils.py 后输出没变化、变量没定义、函数没生效——不是失败了,是还没 run。
- 路径必须相对当前 notebook 所在目录,比如
%load ./src/preprocess.py,不能写绝对路径(除非用%load /home/user/xxx.py,但跨环境易失效) - 如果
.py文件里有if __name__ == '__main__':块,它会被一并加载进来,且会在你 Run cell 时触发——这点常被忽略,可能意外执行主逻辑 -
%load不支持通配符或批量加载,一次只能指定一个文件
%load 和 %run 的核心区别在哪
%load 是“抄代码”,%run 是“直接跑”。前者让你能编辑、调试、分步执行;后者适合一键验证脚本结果,且会把脚本里定义的变量、函数全部注入当前命名空间。
使用场景举例:
- 想改几行再试 → 用
%load - 跑完就丢、不关心中间过程 → 用
%run - 脚本里用了
sys.exit()或input()→%run会卡住或退出 kernel,%load可以删掉再跑
注意:%run 的副作用更重——比如它会覆盖同名变量,而 %load 因为你自己控制执行时机,反而更可控。
修改 .py 文件后,%load 加载的还是旧代码?
是的。%load 每次都是读取磁盘上的最新文件,所以只要保存了 .py 文件,下次执行 %load 就会拿到新内容。但如果你已经加载过一次、又改了 .py,却忘了重新 %load,那 cell 里还是旧代码。
容易踩的坑:
- 误以为 “加载过一次就自动同步” —— 实际上每次都需要显式执行
%load - 在 notebook 里手动改了
%load进来的代码,结果回头又%load覆盖掉了 —— 建议改完立刻另存为新 cell 或及时保存到.py - 用
%load加载后删了部分代码,再想恢复?只能重新%load或从文件里复制
为什么有时候 %load 报错 “File not found”
根本原因:jupyter 当前工作目录 ≠ 你直觉认为的“那个文件夹”。它默认是启动 jupyter 时所在的目录,不是 notebook 文件所在目录。
查当前路径最稳的方式:%pwd;看当前目录下有什么:%ls。
- 如果
.py在子目录,必须写对相对路径,比如%load ./modules/helper.py - 路径里有空格或中文?尽量避免,否则 shell 解析可能出错
- 用
%cd切换工作目录后,%load路径也要跟着变
复杂点在于:notebook 的位置、终端启动位置、conda 环境的默认路径,三者未必一致——别猜,%pwd 一眼看清。


















