Jupyter 架构
本地 Notebook 会话并非单一进程,而是由三个独立角色协同工作:
- 客户端 (Client):浏览器或编辑器界面,负责单元格编辑与输出展示。
- 服务器 (Server):中枢节点,管理文件、会话、认证、HTTP/WebSocket 连接及内核生命周期。
- 内核 (Kernel):特定语言的进程,负责执行代码并维护运行时状态。
这三个角色既可运行在同一台机器上,也可通过远程连接分布在不同节点。此外,任何支持 Jupyter 消息协议的前端均可接入,无需依赖传统的 Notebook UI。
.ipynb 文件的内容边界
.ipynb 本质是一个 JSON 文件,包含:
- Markdown 和代码单元格;
- 单元格及 Notebook 元数据;
- 已保存的输出(文本、图片、富媒体数据等);
- 内核与语言标识。
关键缺失:它不包含正在运行的 Python/R 进程、已安装包、外部数据集、环境变量,或任何影响执行的隐藏状态。这就是为什么一个保存良好的 Notebook 在本地显示正常,换台机器重跑却报错的原因——环境状态没有随文件迁移。
通信流程:客户端、服务器与内核
当会话需要内核时,服务器负责启动或连接内核,并持有其 ZeroMQ 连接详情。
- 浏览器客户端通过 HTTP 和 WebSocket 与服务器通信。
- 服务器充当桥梁,将消息转发至内核的 Jupyter 通道。
- 内核在单元格之间保持变量状态,直到被重启或关闭。
打开 Notebook 时,通常会自动启动或连接指定内核,但具体行为取决于前端实现和当前会话状态。若仅查看静态 Notebook(不执行代码),则无需活动内核。
nbconvert 转换机制
nbconvert 的工作流程如下:
- 读取 Notebook 文档;
- 应用可选的预处理器(Preprocessors);
- 将结果传递给导出器(如 HTML、Markdown);
- 部分格式会进一步使用模板或后处理器。
注意:转换过程默认不执行代码,而是直接复用文件中已保存的输出。只有明确配置执行选项时,才会重新运行 Notebook。
jupyter nbconvert --to html analysis.ipynb
工程实践建议
Notebook 中的执行计数(Execution Count)和可见输出不能作为可复现性的保证。
为确保代码可复现,必须:
- 重启内核;
- 按顺序运行所有单元格;
- 锁定依赖环境(如
requirements.txt或environment.yml); - 记录所有外部输入数据。
当代码具备复用价值或进入生产环境时,应将其重构为带测试的独立模块,Notebook 仅作为调用入口,而非逻辑载体。