架构#

此页面包含有关 Jupyter 生态系统中核心部分的不同架构设计的信息。其中一些是单个项目,而另一些则显示项目之间的关系。

项目概述#

以下是项目关系的高级可视化概述。截至 2022 年,它是最新的。

Architecture diagram of Jupyter project relationships from servers, applications, API, and kernels.

IPython 内核#

本节重点介绍 IPython 和内核。当我们讨论 IPython 时,我们讨论两个基本角色

  • 终端 IPython 作为熟悉的 REPL

  • IPython 内核,IPykernel,它提供与前端界面(如笔记本)的计算和通信

终端 IPython#

当你输入 ipython 时,你会得到原始的 IPython 界面,在终端中运行。它执行类似以下操作

while True:
    code = input(">>> ")
    exec(code)

当然,它要复杂得多,因为它必须处理多行代码、使用 readline 的制表符补全、魔术命令等。但模型类似于代码示例:提示用户输入一些代码,当他们输入代码后,在同一进程中执行它。此模型通常称为 REPL,或读入-求值-打印-循环。

IPython 内核#

所有其他界面——笔记本、Qt 控制台、ipython console(在终端中)和第三方界面——都使用 IPython 内核。IPykernel 是一个单独的进程,负责运行用户代码,以及计算可能的补全等事项。前端(如笔记本或 Qt 控制台)使用通过 ZeroMQ 套接字发送的 JSON 消息与 IPython 内核通信;前端和 IPython 内核之间使用的协议在 Jupyter 中的消息传递 中进行了描述。

内核的核心执行机制与终端 IPython 共享。

一个内核进程可以同时连接到多个前端。在这种情况下,不同的前端将可以访问相同的变量。

此设计旨在允许基于同一内核轻松开发不同的前端,但它也使得通过在这些语言中开发内核来支持同一前端中的新语言成为可能,我们正在改进 IPython 以使其更实用。

目前,有三种方法可以为另一种语言开发内核

  • 包装器内核重用 IPykernel 中的通信机制,并且仅实现核心执行部分。

  • 本机内核在目标语言中实现执行和通信。

  • 基于 xeus(该协议的本机实现)的内核实现内核的特定于语言的部分。与包装器方法相反,xeus 不依赖于 python 运行时。

对于具有良好 Python 包装器的语言(如 octave_kernel)或在其中实现通信机制不切实际的语言(如 bash_kernel),包装器内核更容易快速编写。本机内核很可能由使用它们的社区更好地维护,如 IJuliaIHaskell。当语言解释器提供 C++ 或 C API 时,Xeus 内核很容易编写。

Jupyter Notebook 格式#

Jupyter Notebook 是表示代码、元数据、内容和输出的结构化数据。当保存到磁盘时,笔记本使用扩展名 .ipynb,并使用 JSON 结构。有关笔记本格式结构和规范的更多信息,请参阅 nbformat 文档

Jupyter Notebook 界面#

Jupyter Notebook 及其灵活的界面将笔记本扩展到代码之外,包括可视化、多媒体、协作等等。除了运行代码外,它还将代码和输出与 markdown 注释一起存储在一个称为笔记本的可编辑文档中。保存时,此内容会从浏览器发送到 Jupyter 服务器,后者会将其作为扩展名为 .ipynb 的 JSON 文件保存到磁盘。

Jupyter 服务器是一个通信中心。浏览器、磁盘上的笔记本文件和内核无法直接相互通信。它们通过 Jupyter 服务器进行通信。Jupyter 服务器(而不是内核)负责保存和加载笔记本,因此即使没有该语言的内核,你也可以编辑笔记本——你只是无法运行代码。内核对笔记本文档一无所知:它只是在用户运行代码时收到要执行的代码单元。

将 Jupyter Notebook 导出到其他格式#

Jupyter 中的 Nbconvert 工具 将笔记本文件转换为其他格式,例如 HTML、LaTeX 或 reStructuredText。此转换会经历一系列步骤

  1. 预处理器在内存中修改笔记本。例如,ExecutePreprocessor 运行笔记本中的代码并更新输出。

  2. 导出器将笔记本转换为另一种文件格式。大多数导出器为此使用模板。

  3. 后处理器处理导出产生的文件。

nbviewer 网站使用带有 HTML 导出器的 nbconvert。当你给它一个 URL 时,它会从该 URL 获取笔记本,将其转换为 HTML,然后向你提供该 HTML。

IPython.parallel#

IPython 还包括一个并行计算框架 IPython.parallel。这允许你控制许多单独的引擎,它们是上面描述的 IPython 内核的扩展版本。

JupyterHub 和 Binder#

JupyterHub 是一个多用户 Hub,它生成、管理和代理多个单用户 Jupyter 笔记本服务器实例。这可用于提供各种界面和环境,并且可以在多种基础设施上运行。Kubernetes 上的 JupyterHub 是一个 Helm 图表,用于在 Kubernetes 基础设施上运行 JupyterHub,而 BinderHub 是一个定制的 JupyterHub 部署,用于可共享、可重复的交互式计算环境。

以下链接描述了 JupyterHub 的架构和 JupyterHub 的几个发行版。

JupyterLab#

JupyterLab 是一个灵活、可扩展的交互式计算界面。以下是一些有助于理解 JupyterLab 架构的有用链接。