架构#
本页包含有关 Jupyter 生态系统中核心部件不同架构设计的信息。其中一些是独立项目,而其他则展示了项目之间的关系。
项目概述#
以下是项目关系的高层次视觉概览。截至2022年。
IPython 内核#
本节重点介绍 IPython 和内核。当我们讨论 IPython
时,我们谈论两个基本角色:
终端 IPython 作为熟悉的 REPL
IPython 内核,即提供计算和与前端接口(如笔记本)通信的
IPykernel
终端 IPython#
当你输入 ipython
时,你会得到原始的 IPython 界面,运行在终端中。它看起来像这样:
while True:
code = input(">>> ")
exec(code)
当然,它要复杂得多,因为它必须处理多行代码、使用 readline
的制表符补全、魔法命令等等。但模型类似于代码示例:提示用户输入一些代码,当他们输入完成后,在同一个进程中执行它。这种模型通常被称为 REPL,即读取-求值-打印-循环。
IPython 内核#
所有其他接口——Notebook、Qt控制台、终端中的``ipython console``以及第三方接口——都使用IPython内核。Ipykernel是一个独立的进程,负责运行用户代码以及计算可能的补全等任务。前端,如Notebook或Qt控制台,通过`ZeroMQ <http://zeromq.org/>`_套接字发送的JSON消息与IPython内核通信;前端与IPython内核之间使用的协议在:ref:`jupyterclient:messaging`中描述。
内核的核心执行机制与终端 IPython 共享。
一个内核进程可以同时连接到多个前端。在这种情况下,不同的前端将可以访问相同的变量。
这个设计旨在允许基于相同内核轻松开发不同的前端,但它也使得通过开发这些语言的内核,在相同的前端中支持新语言成为可能,我们正在改进 IPython 以使其更加实用。
今天,有三种方式为另一种语言开发内核:
包装内核重用了来自 IPykernel 的通信机制,并且仅实现了核心执行部分。
本地内核在目标语言中实现执行和通信。
基于 xeus 的内核,这是一种协议的原生实现,实现了内核的语言特定部分。与包装器方法相反,xeus 不依赖于 Python 运行时。
包装内核对于那些有良好Python包装器的语言来说,编写起来更快,例如 octave_kernel,或者对于那些实现通信机制不切实际的语言,例如 bash_kernel。本地内核可能会由使用它们的社区更好地维护,例如 IJulia 或 IHaskell。当语言解释器提供C++或C API时,编写Xeus内核很容易。
Jupyter Notebook 格式#
Jupyter Notebooks 是结构化数据,表示您的代码、元数据、内容和输出。当保存到磁盘时,笔记本使用扩展名 .ipynb
,并使用 JSON 结构。有关笔记本格式结构和规范的更多信息,请参阅 nbformat 文档。
Jupyter Notebook 界面#
Jupyter Notebook 及其灵活的界面将笔记本的功能扩展到代码之外,包括可视化、多媒体、协作等。除了运行代码外,它还存储代码和输出,以及 Markdown 笔记,在一个可编辑的文档中,称为笔记本。当你保存它时,这些内容会从你的浏览器发送到 Jupyter 服务器,服务器将其保存为磁盘上的一个 JSON 文件,扩展名为 .ipynb
。
Jupyter 服务器是一个通信中心。浏览器、磁盘上的笔记本文件和内核不能直接相互通信。它们通过 Jupyter 服务器进行通信。Jupyter 服务器,而不是内核,负责保存和加载笔记本,因此即使你没有该语言的内核,你也可以编辑笔记本——只是你将无法运行代码。内核对笔记本文档一无所知:它只是在用户运行时接收到要执行的代码单元。
将 Jupyter 笔记本导出为其他格式#
Jupyter 中的 Nbconvert 工具 将笔记本文件转换为其他格式,如 HTML、LaTeX 或 reStructuredText。此转换过程包括一系列步骤:
预处理器修改内存中的笔记本。例如,ExecutePreprocessor 运行笔记本中的代码并更新输出。
导出器将笔记本转换为另一种文件格式。大多数导出器使用模板来完成这一任务。
后处理器对导出后生成的文件进行处理。
nbviewer 网站使用 nbconvert 和 HTML 导出器。当你给它一个 URL 时,它会从该 URL 获取笔记本,将其转换为 HTML,并将该 HTML 提供给你。
IPython.parallel#
IPython 还包括一个并行计算框架,IPython.parallel。这允许你控制许多单独的引擎,这些引擎是上述 IPython 内核的扩展版本。
JupyterHub 和 Binder#
JupyterHub 是一个多用户 Hub,它生成、管理和代理单用户 Jupyter notebook 服务器的多个实例。这可以用于服务多种接口和环境,并且可以在多种基础设施上运行。Kubernetes 上的 JupyterHub 是一个用于在 kubernetes 基础设施上运行 JupyterHub 的 Helm Chart,而 BinderHub 是一个为可共享、可复现的交互式计算环境定制的 JupyterHub 部署。
以下链接描述了 JupyterHub 的架构及其几种发行版。
JupyterLab#
JupyterLab 是一个灵活、可扩展的交互式计算界面。以下是一些有助于理解 JupyterLab 架构的链接。