批量运行单元格需按目标选择策略:顺序执行、跳过非代码块或仅运行标记代码;run all 不重置内核但会覆盖变量,易致结果错乱;命令模式选中后shift+enter更安全;自动化场景用nbformat+nbclient脚本化执行。

批量运行单元格不是“一键全选再执行”那么简单——它依赖于你真正想达成的目标:是按顺序全部执行,还是跳过某些类型(比如 Markdown),或是只运行带特定标记的代码块?直接 Ctrl+Enter 或 Shift+Enter 逐个按,效率低还容易漏;而盲目用 Run All 又可能因变量覆盖或内核状态异常导致结果错乱。
Run All 会重置所有变量,但不重置内核状态
点击菜单 Cell → Run All 或快捷键 Alt+Enter(部分 IDE 中为 Ctrl+Alt+Shift+Enter)确实能一次性执行全部代码单元格,但它不会重启内核。这意味着:
- 之前已定义的全局变量、导入的模块、修改过的
sys.path等仍存在,可能和当前代码逻辑冲突 - 如果中间某个单元格抛出异常并被忽略(比如用了
try/except吞掉错误),后续单元格仍会继续执行,结果不可信 - Markdown 单元格也会被“运行”,虽然不执行代码,但会影响输出渲染顺序(尤其含
%%html或动态 JS 的情况)
用命令模式批量选中 + 执行更可控
真正需要的是「选中范围 → 统一执行」,而不是无差别全跑。Jupyter 的命令模式(按 Esc 进入)支持多种选中方式:
-
Shift+Up/Down:连续选中上下多个单元格(含当前) -
Shift+Home:选中从当前单元格到第一个单元格 -
Shift+End:选中从当前单元格到最后一个单元格 -
Ctrl+Click(Windows/Linux)或Cmd+Click(macOS):非连续多选(注意:仅在较新 JupyterLab 版本或启用实验性功能时有效)
选中后,按 Shift+Enter 即可顺序执行所选单元格——这才是安全的批量运行逻辑:变量作用域清晰、错误中断及时、跳过非代码单元格也由你决定。
用 nbformat 脚本化批量运行(适合 CI/自动化)
如果你需要在没有 GUI 的环境(如服务器、CI 流水线)里批量执行,nbformat + nbclient 是唯一可靠路径:
from nbclient import NotebookClient
from nbformat import read
with open("notebook.ipynb") as f:
nb = read(f, as_version=4)
client = NotebookClient(nb, timeout=600, kernel_name="python3")
client.execute()
注意几个硬性限制:
-
nbclient不支持交互式输入(input()会卡住),需提前用%%capture或参数化处理 - 执行完的 notebook 对象不会自动保存,需手动调用
write()写回文件 - 若 notebook 含相对路径导入(如
from .utils import helper),需确保工作目录正确,否则ModuleNotFoundError必现
真正麻烦的从来不是“怎么批量运行”,而是“批量运行之后,谁来保证每个单元格的上下文干净、输出可复现”。别迷信 Run All,先想清楚你要重放的是哪一段逻辑链,再决定选中范围或写脚本——否则修 bug 的时间,比写代码还长。











