从启动到导出:真正掌握 Jupyter Notebook 的运行逻辑

2026-09-25 21 预计阅读时间: 1 分钟
来源: realpython.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

Jupyter Notebook 看起来像一份可以执行代码的文档,但它实际上组合了浏览器界面、后台服务器和语言内核。理解这三者的关系,才能解释为什么单元格可以乱序执行、为什么关闭网页后进程可能仍在运行,以及为什么导出的结果有时与当前页面不同。

浏览器不是 Notebook 的全部

启动 Jupyter Notebook 时,终端会运行一个本地服务器,浏览器只是连接到这个服务器的客户端。服务器负责文件管理,内核负责执行 Python 等语言的代码。

可以在一个空目录中创建练习环境:

mkdir jupyter-practice
cd jupyter-practice
python -m venv .venv

# macOS 或 Linux
source .venv/bin/activate

# Windows PowerShell 请改用:
# .venv\Scripts\Activate.ps1

python -m pip install notebook nbconvert
jupyter notebook

命令执行后,终端通常会打印一个带访问令牌的本地地址。不要把这个地址或令牌发送给不受信任的人,因为它可能允许对方访问当前 Jupyter 工作目录,甚至执行代码。

如果运行环境没有图形界面,可以禁止自动打开浏览器:

jupyter notebook --no-browser --port=8888

浏览器标签页关闭并不一定代表服务器已经停止。结束服务时,应回到启动它的终端并按 Ctrl+C,然后按提示确认。

单元格的关键陷阱:文档顺序不等于执行顺序

Notebook 中常见的单元格包括 Markdown 单元格和代码单元格。Markdown 用来记录说明、公式和结论;代码单元格则交给当前内核执行。

真正需要警惕的是:内核保存的是当前内存状态,而不是页面从上到下的视觉顺序。例如,先运行下面的单元格:

price = 20
quantity = 3

再运行:

total = price * quantity
total

结果是 60。如果之后把第一个单元格中的 price 改成 50,但没有重新执行它,第二个单元格再次运行时仍可能使用旧值 20。

这类隐藏状态会让 Notebook 出现“在我电脑上可以运行”的问题。提交、分享或导出前,建议执行一次以下流程:

  1. 保存 Notebook。
  2. 重启内核,清空内存中的变量和导入状态。
  3. 从头运行全部单元格。
  4. 检查是否有报错、缺失文件或依赖隐式执行顺序的代码。

判断一份 Notebook 是否可复现,最直接的标准不是“当前页面有输出”,而是“重启内核后仍能从头运行成功”。

做一个可从头运行的小实验

新建一个名为 demo.ipynb 的 Python Notebook,将下面代码放入一个代码单元格并运行。这个示例只使用 Python 标准库,会计算平均值并生成一个文本文件:

from pathlib import Path
from statistics import mean

scores = [82, 91, 76, 88, 95]
result = {
    "count": len(scores),
    "average": round(mean(scores), 2),
    "maximum": max(scores),
}

report = "\n".join(f"{key}: {value}" for key, value in result.items())
Path("summary.txt").write_text(report, encoding="utf-8")

print(report)
print("Saved to summary.txt")

再添加一个 Markdown 单元格,记录实验目的和结论:

## Score summary

This notebook calculates basic statistics for a small score dataset.
The generated `summary.txt` file can be used by later processing steps.

这个练习体现了 Notebook 的两种角色:一方面,它是包含解释和结果的可读文档;另一方面,它仍然是会读取、创建和修改文件的程序。运行来源不明的 Notebook 前,应像审查普通 Python 脚本一样检查其代码。

导出结果与管理扩展

完成分析后,可以把 Notebook 导出为适合阅读或版本管理的格式。确保当前目录中存在 demo.ipynb,然后运行:

jupyter nbconvert --to html demo.ipynb
jupyter nbconvert --to markdown demo.ipynb

HTML 适合直接交付给读者,Markdown 更便于进入文档系统或代码仓库。某些输出格式可能依赖额外工具,例如 PDF 导出经常需要独立的排版或浏览器组件,因此应在团队环境中提前验证。

导出操作也不应被视为重新执行。页面中保存的输出可能来自较早的内核状态。更稳妥的做法是在导出前重启内核并运行全部单元格;自动化场景还可以显式执行后再生成 HTML:

jupyter nbconvert \
  --to html \
  --execute demo.ipynb \
  --ExecutePreprocessor.timeout=120

扩展可以增加目录、格式化、变量查看等能力,但不同产品和版本使用的扩展机制并不完全相同。排查环境时,可以先查看已经启用的服务器扩展:

jupyter server extension list

如果使用的是 JupyterLab,还可以查看其前端扩展:

jupyter labextension list

安装扩展前要确认它面向的是经典 Notebook、Notebook 7、Jupyter Server 还是 JupyterLab,并检查版本兼容性。扩展能够在浏览器或服务器进程中运行代码,因此不应把来历不明的扩展直接装进包含敏感数据的环境。

使用前的检查清单

一份可靠的 Notebook 至少应该满足以下条件:

  • 能说清服务器、浏览器界面和内核分别承担什么职责。
  • 知道运行单个单元格与从头运行全部单元格的区别。
  • 重启内核后,单元格按照文档顺序仍能执行成功。
  • 导出前验证输出,而不是依赖残留的内存状态。
  • 明确 HTML、Markdown 等导出格式的使用场景和外部依赖。
  • 安装扩展前确认产品版本、权限范围和维护状态。
  • 不公开访问令牌,也不直接运行不可信 Notebook 中的代码。

Jupyter Notebook 的上手门槛很低,真正的熟练度却体现在状态管理、可复现性和安全边界上。把 Notebook 当成“带执行环境的项目”,而不是临时草稿,能显著减少分享、导出和协作时的问题。


相关推荐