最常用可靠的一次性运行多个cell方式是菜单操作:Cell → Run All Below(从当前cell开始往下全跑)或Cell → Run All(整个notebook全跑),二者均只执行代码cell、跳过Markdown cell,且不依赖快捷键记忆或光标位置。

怎么一次性运行多个 cell
直接选中从当前 cell 到末尾的所有单元格,按 Ctrl Enter 或点击工具栏的「Run」按钮,只会运行当前 cell;真正批量运行得用对命令。最常用、最可靠的方式是菜单操作:Cell → Run All Below(从当前 cell 开始往下全跑),或 Cell → Run All(整个 notebook 全跑)。这两个操作不依赖快捷键记忆,也不受光标位置干扰,适合快速重跑分析流程。
-
Shift + Enter连续按确实能逐个执行,但容易漏掉中间某个 cell,尤其当 cell 有隐藏输出或报错被折叠时 - 用
Alt + Enter插入新 cell 后再跑,本质还是单 cell 操作,不算“批量” - 如果 notebook 里混着 Markdown cell,
Run All会跳过它们——只执行代码 cell,这点不用额外担心
用 %run 调用另一个 notebook 算不算批量运行
算,但不是“本 notebook 内批量”,而是把执行逻辑外包出去。%run 可以加载并执行另一个 .ipynb 文件,效果等同于把那个 notebook 的所有代码 cell 顺序粘贴进当前 session。它继承当前 kernel 的变量空间,所以你可以在 %run 前定义好 data_path、model_config 这类参数,被调用的 notebook 直接用。
- 路径必须写对:
%run ./preprocess.ipynb(相对路径)或%run /full/path/to/train.ipynb(绝对路径) - 不能带空格或中文路径,否则报
FileNotFoundError: [Errno 2] No such file or directory - 如果被调用的 notebook 里用了
sys.argv或argparse,%run默认不传参;要传参得写成%run -i train.py --epochs 10(注意是 .py,不是 .ipynb)
为什么 “Run All” 之后有些变量没生效
因为 notebook 执行顺序不是线性的,而是依赖单元格的执行历史。比如你在第 5 个 cell 定义了 df = pd.read_csv("data.csv"),但第 10 个 cell 用了 df.head(),如果你只选中 10–20 行跑 Run All Below,df 就根本没定义,直接报 NameError。
- 检查左下角 cell 左侧的
In [ ]编号:数字越大说明越晚执行,空白或*表示未执行或正在运行 - 重启 kernel 后一定要先
Run All,否则变量全部丢失,后续 cell 全部失效 - 别依赖“视觉顺序”——拖动 cell 会改变显示位置,但不改变执行依赖链
自动化批量运行:nbconvert 和 crontab 怎么配合
真正需要“无人值守批量运行”的场景(比如每天凌晨拉数据、训练模型、发报告),靠手动点菜单不现实,得走命令行。核心工具是 jupyter nbconvert 加 --execute 参数,它会在干净 kernel 里顺序执行所有 code cell,并保存结果到新文件。
- 基础命令:
jupyter nbconvert --to notebook --execute --inplace pipeline.ipynb(--inplace表示原地覆盖,保留输出) - 加
--allow-errors可让部分 cell 报错也不中断整个流程,适合监控类 notebook - 在 Linux 上配 crontab:
0 3 * * * cd /path/to/notebooks && /opt/anaconda3/bin/jupyter nbconvert --execute report.ipynb(注意指定完整 jupyter 路径,避免环境错乱) - Windows 用户别硬套 crontab,改用 Task Scheduler,且必须用
cmd /c包裹命令,否则找不到 jupyter
执行顺序和变量生命周期是批量运行里最容易被忽略的两件事。哪怕只是多点一次 Run All,也可能因 kernel 状态不同导致结果不一致。


















