%load用于将.py文件内容加载到当前cell,适合快速复用;%run直接执行.py文件并保留变量;import则需确保路径正确且配合autoreload实现热更新。

直接用 %load 把 .py 文件内容塞进当前 cell
这是最轻量、最直观的方式,适合快速复用一段已有脚本,比如调试或临时跑通逻辑。
操作很简单:在 notebook 的任意 cell 里写 %load your_script.py,然后按 Shift+Enter 执行。Jupyter 会把文件全文读进来,同时自动把这行命令转成注释(变成 # %load your_script.py),避免重复执行时出错。
- 文件必须在当前工作目录下,或者提供相对/绝对路径,比如
%load ../utils/helper.py - 如果路径含空格或中文,建议改名或用引号包裹(但部分旧版本不支持引号,稳妥起见还是用英文无空格路径)
-
%load是 magic 命令,只对单个 cell 生效,不会影响后续 import 行为
用 %run 直接执行 .py 文件,像运行脚本一样
当你想完整跑一遍 .py 文件里的代码(包括变量定义、函数调用、绘图等),而不是把它粘进 cell,%run 更合适。
在 cell 中输入 %run your_script.py 并执行,效果等同于你在终端里敲 python your_script.py —— 它会顺序执行全部语句,并把生成的变量留在当前命名空间里。
- 支持参数传递,例如
%run script.py arg1 arg2,脚本内可通过sys.argv获取 - 不能跨 kernel 持久化:如果重启 kernel,之前
%run加载的变量就没了 - 若脚本里有
exit()或异常未捕获,会导致当前 cell 中断,但 kernel 不一定崩溃
当成模块 import,需要确保 Python 能找到它
这是真正“导入模块”的方式,适用于你写了一组函数/类,想在 notebook 里反复调用,类似标准库用法。
前提是你得让 Python 的 sys.path 包含该 .py 文件所在目录。最常用的是把文件放在和 .ipynb 同一目录下,然后直接 import your_module。
- 如果模块不在同目录,别硬写相对路径 import;先运行
import sys; sys.path.append('/path/to/your/module'),再 import - 注意文件名不能是 Python 关键字(如
class.py)、不能含中划线(my-tool.py会报错,得改成my_tool.py) - 修改了
.py文件后,再次 import 不会自动重载 —— 得配合%reload_ext autoreload和%autoreload 2,否则看到的是旧代码
常见错误:明明文件就在旁边,却提示 “ModuleNotFoundError”
这不是路径写错了,大概率是工作目录没对上。
Jupyter 启动时的当前路径(即 %pwd 输出的路径)才是 Python 查找模块的起点,不是 notebook 文件所在目录。很多人双击 .ipynb 打开,结果 kernel 在用户主目录启动,自然找不到同级的 .py 文件。
- 打开 notebook 前,先用终端 cd 到目标目录,再运行
jupyter notebook - 或者在 notebook 里先执行
%cd /path/to/your/project切换工作目录 - 用
!ls或!dir(Windows)确认当前目录下真有那个 .py 文件 - 别依赖“文件浏览器里看着挨着”,Jupyter 的 file tree 和 kernel 工作目录是两回事
真正卡住人的地方,往往不是语法不会写,而是 %pwd 和 sys.path 对不上,或者改了 .py 文件却忘了 %autoreload。动手前先敲一行 %pwd 看清楚自己在哪,比反复试 import 更省时间。











