跳到主要内容

Jupyter 架构

本地 Notebook 会话并非单一进程,而是由三个独立角色协同工作:

  1. 客户端 (Client):浏览器或编辑器界面,负责单元格编辑与输出展示。
  2. 服务器 (Server):中枢节点,管理文件、会话、认证、HTTP/WebSocket 连接及内核生命周期。
  3. 内核 (Kernel):特定语言的进程,负责执行代码并维护运行时状态。

这三个角色既可运行在同一台机器上,也可通过远程连接分布在不同节点。此外,任何支持 Jupyter 消息协议的前端均可接入,无需依赖传统的 Notebook UI。

.ipynb 文件的内容边界

.ipynb 本质是一个 JSON 文件,包含:

  • Markdown 和代码单元格;
  • 单元格及 Notebook 元数据;
  • 已保存的输出(文本、图片、富媒体数据等);
  • 内核与语言标识。

关键缺失:它不包含正在运行的 Python/R 进程、已安装包、外部数据集、环境变量,或任何影响执行的隐藏状态。这就是为什么一个保存良好的 Notebook 在本地显示正常,换台机器重跑却报错的原因——环境状态没有随文件迁移。

通信流程:客户端、服务器与内核

当会话需要内核时,服务器负责启动或连接内核,并持有其 ZeroMQ 连接详情。

  • 浏览器客户端通过 HTTP 和 WebSocket 与服务器通信。
  • 服务器充当桥梁,将消息转发至内核的 Jupyter 通道。
  • 内核在单元格之间保持变量状态,直到被重启或关闭。

打开 Notebook 时,通常会自动启动或连接指定内核,但具体行为取决于前端实现和当前会话状态。若仅查看静态 Notebook(不执行代码),则无需活动内核。

nbconvert 转换机制

nbconvert 的工作流程如下:

  1. 读取 Notebook 文档;
  2. 应用可选的预处理器(Preprocessors);
  3. 将结果传递给导出器(如 HTML、Markdown);
  4. 部分格式会进一步使用模板或后处理器。

注意:转换过程默认不执行代码,而是直接复用文件中已保存的输出。只有明确配置执行选项时,才会重新运行 Notebook。

jupyter nbconvert --to html analysis.ipynb

工程实践建议

Notebook 中的执行计数(Execution Count)和可见输出不能作为可复现性的保证。

为确保代码可复现,必须:

  • 重启内核;
  • 按顺序运行所有单元格;
  • 锁定依赖环境(如 requirements.txtenvironment.yml);
  • 记录所有外部输入数据。

当代码具备复用价值或进入生产环境时,应将其重构为带测试的独立模块,Notebook 仅作为调用入口,而非逻辑载体。

参考资料

探索关联

被引用 (2)

同主题的其他笔记 (1)

打开关联网络