什么是 Jupyter?#

JupyterLab 笔记本编辑器,其中打开的笔记本显示胰岛素受体的交互式视图 上图: JupyterLab 中的笔记本,显示胰岛素受体的交互式 视图。

📘 关于:本文档解释了 Jupyter 生态系统中的基本思想和软件。

“Jupyter”可以表示很多东西,所以让我们从头开始,逐步进行

最重要的是,“Project Jupyter”是一个涵盖许多不同软件产品和工具的大型伞形项目。其中包括 Jupyter NotebookJupyterLab,它们都是流行的笔记本编辑器程序。Jupyter 项目及其子项目都围绕提供工具(和标准)来 通过计算笔记本进行交互式计算。如果您不熟悉其中一些内容,可以在下面进行指导性游览,从头开始解释每一项内容。

术语“Jupyter”通常用作对其中一个产品或思想的简写(这可能会引起混淆)。让我们仔细看看每一部分,并在下面提供一些清晰的解释。

什么是“计算笔记本”?#

一位著名的计算机程序员 (唐纳德·克努斯) 推广了将解释性英语文本与计算机代码相结合的想法,这通常称为 可读编程通过采用这种做法,计算机程序以及其他复杂 信息和思想可以更好地向广泛的人群解释。

以这种方式编写的程序可以打印在纸上并作为实际“笔记本”手动共享,但在现代,它们以“笔记本文件”的形式以数字方式共享,并且可以包含图像、3D 模型和交互式图形等其他丰富媒体,以及数据和其他程序输出。

通过使用 JupyterLab 等编辑器程序打开笔记本,您还可以运行笔记本中的代码。由于笔记本可以包含几乎可以执行任何操作的代码,因此您可以在笔记本中执行常规软件可以执行的几乎所有操作。例如,笔记本文件可用于

最后三个是真实世界的示例,展示了科学界对计算笔记本的使用。由于科学家、工程师和其他技术人员经常需要执行和交流复杂的计算来描述他们的工作,因此这些“计算笔记本”成为分享他们的工作和想法的一种非常流行的方式。

笔记本也不仅仅是 NASA 科学家使用的:学生、业余爱好者和商界人士通常在 JupyterLab 中使用快速、交互式的工作流来制作笔记本,以帮助解决日常问题。你可以使用它们向他人解释自己的想法、学习、自动化家庭或工作中的任务、可视化复杂信息等等。

当有人使用术语“笔记本”时,他们可能指的是

  • 他们计算机上的笔记本文件

  • 将计算机代码、说明性文本、图像等组合到“笔记本格式”中的想法

  • 用于编写和编辑数字笔记本文件的“Jupyter Notebook”应用程序

  • Jupyter 的 .ipynb 笔记本文件格式(用于将笔记本文件保存在计算机上),由 nbformat 软件库解释

术语“Jupyter”可能指的是

  • “Project Jupyter”,总体框架项目

  • “Jupyter Notebook”或“JupyterLab”编辑程序(或其他 Jupyter 产品)

Jupyter 这个名称来自该项目最初支持的三种编程语言:Julia (ju)、Python (pyt) 和 R (r)。

Jupyter 笔记本编辑器程序如何工作?#

像 JupyterLab 或 Jupyter Notebook 这样的笔记本编辑器程序通常会共享一些功能和工作流,因为它们受到一组关于计算笔记本、它们的优点以及如何最有效地使用它们的共同思想的影响。

让我们来看看其中一些想法。

交互式编程(REPL)#

过去,编写程序、运行程序和查看结果通常是一个比现在更慢、更深思熟虑的过程。

随着时间的推移,人们发现了新的技术,可以加快编写代码、运行代码和查看结果之间的过程。后来还引入了 Python 等语言,这些语言比旧语言提供了一些独特的优势。

例如,Python 是一种解释型语言,因此在运行之前不需要对其进行 编译(为程序员节省步骤和时间)。它也是一种动态类型语言,不需要程序员在使用数据之前预先指定其数据类型,这有时可以节省时间并降低代码的复杂性(特别是对于较小、较简单的程序)。

另一种编程技术(这是 Jupyter 笔记本编辑程序的关键)是读-求值-打印-循环 (REPL),它允许程序员交互式地编写代码、运行代码、保持其数据和变量完好无损,然后在不丢失数据的情况下随时重写、重新运行和优化其代码(程序运行结束后)。

REPL 之所以得名,是因为程序员编写代码片段,这些代码片段首先被读取 (R),然后被求值 (E) 或换句话说执行,结果被打印 (P) 到某种显示或输出,并且该过程在循环 (L) 中重复发生,其中 REPL 等待程序员有另一个要执行的代码片段。

新的代码片段可以引用在之前的求值步骤中定义的变量,因为 REPL 将创建的对象(通过循环的先前运行)保留在内存中,直到用户关闭其 REPL。

内核#

JupyterLab 等笔记本编辑器程序会为每个打开的笔记本文件创建一个 REPL(在上面了解更多信息),使用您选择的语言。在 Jupyter 生态系统中,每个 REPL 都称为内核,它在计算机上的长期运行程序中保存您使用笔记本代码创建的数据和对象(这些内核的管理和创建由 Jupyter Server 协调,稍后会详细介绍)。

这就是为什么当您连续执行多个笔记本单元格时不会丢失数据和变量的原因,它们在 REPL 中保持活动状态,以便您可以继续使用它们来探索数据和正在调查的问题(但是,如果您关闭保存内核的 Jupyter 服务器,您将丢失这些变量)。

为您的每个笔记本在后台运行的内核是 Jupyter 笔记本编辑器程序擅长的快速探索性编程工作流的动力。

多个程序,一种体验(客户端-服务器架构)#

Project Jupyter 中的大多数笔记本编辑器程序(如 JupyterLab)可能看起来像是一种体验,但当您在笔记本电脑上运行 JupyterLab 时,实际上有几个程序独立运行,它们相互协调,为您提供您可能已经熟悉的笔记本编辑体验。

这可能看起来像是不必要的背景细节,但对内部工作原理的一些了解可以帮助您了解笔记本创作体验,并开辟您可以利用的新功能、想法和工作流。

对于使用 Jupyter 软件的人员以及编写软件的人员来说,多部分(模块化)方法也有优势。

让我们来看看一些部分

  • JupyterLab 的界面是一个 Web 应用程序,您可以在 FireFox 或 Google Chrome 等浏览器程序中打开它(网站本身通常具有定义其行为的代码,JupyterLab 的界面也不例外)。

  • Jupyter Server 在后台运行,当您运行笔记本时,它会协调笔记本内核的创建、管理和通信。

  • Jupyter 内核本身是独立程序(操作系统进程),每个内核都是您请求的任何语言中的 REPL(通常是 Python,尽管还有数百种其他语言和内核 也可供使用)。

通过此设计,任何程序(您启用的程序)都可以使用 HTTP 等常见的 Internet 通信技术与您的内核通信。这使您可以跨多个不同程序编辑、查看、共享和操作数据。一个内核甚至可以同时连接到多个编辑程序!(同样,在 JupyterLab 中,您可以将笔记本和控制台连接到同一个内核!)

Project Jupyter 实际上定义了一个 标准,其他程序可以遵循该标准,以便它们可以以您几乎可以想象的任何方式连接到您的内核。您可以使用内核提供的交互式计算功能,以这种方式为您的数据发明新的编辑和查看体验。

多部分设计的优点#

通过将 JupyterLab 等程序分解为多个组件部分,您可以自定义软件以满足您的需求。如果某个部分缺少某些内容,您可以用您自己或其他人制作的自定义版本替换它,以添加您希望看到的任何功能。

您还可以使用那些部分发明完全新的体验,而这些体验可能是设计者在开始时没有想到的,并且它们通常可以与现有的 Jupyter 软件无缝交互。

例如,由于 Jupyter Server 在一个内聚的、自包含的包中提供了内核通信和管理功能,因此新的笔记本编辑器程序可以专注于仅添加新的界面和编辑体验,将创建和管理新内核的任务完全留给 Jupyter Server。

JupyterCAD 是一个建立在 Jupyter 软件之上的 3D 建模工具,例如,还有 其他示例

JupyterCAD 程序 上图所示: JupyterCAD 程序。

与内核通信(Jupyter 协议)#

任何人都可以通过使用 Jupyter 协议 来制作与 Jupyter 的内核通信的新软件(在上面阅读更多相关内容)。该协议提供了一个标准蓝图,用于在内核和其他软件之间来回传递信息。

通过实施 Jupyter 协议中描述的设计,你可以发明一种全新的交互式编程体验,或为 Jupyter 添加对新编程语言的支持。

由于 Project Jupyter 是免费且开放的,因此它鼓励任何人探索使用笔记本和内核的新方法,并希望与其他软件兼容并实现互操作。

我还应该了解 Project Jupyter 的哪些信息?#

Jupyter 软件是免费且开源的,由全球志愿者和贡献者社区开发,可供所有人受益。

Project Jupyter 欢迎来自各种背景且拥有多种技能(不仅仅是软件!)的人,因此我们鼓励你加入我们!你可以直接向制作 Jupyter 软件的人员分享你体验的反馈,或自愿并以多种不同方式为 Jupyter 做出贡献,例如

该项目被划分为在很大程度上独立的子项目,负责处理 Jupyter 软件和社区的不同方面。中央委员会,即 Jupyter 执行委员会,对全项目的目标和政策做出决策,而不同的子项目负责处理各种软件组件的实际开发。

一些子项目负责更广泛的主题,例如 无障碍安全社区文档 项目。

Jupyter 宇宙的(部分)之旅#

在以下部分中,我们将了解 Jupyter 生态系统中的一些流行组件。这不是对 Jupyter 的各个方面的全面参考,而是一个大局摘要,旨在帮助说明前面讨论的一些重要部分。

如果你对 Jupyter 完全陌生,该项目的 关于 页面是值得一读的好文章,它将向你介绍许多不同的子项目。

如果你想了解有关组织结构的更多信息,请查看 治理 页面。

如果你想为该项目做出贡献,请查看 参与 页面。

下图展示了该项目的知名软件组件。

此图表中的连接和组不是正式关系,而是帮助我们在下一部分中绘制大局的简单指示器。

Diagram of well known Jupyter software

笔记本编辑器程序#

Jupyter 项目制作的两个流行的笔记本编辑器程序是 Jupyter-Notebook 和 JupyterLab,但还有其他程序。选择使用哪个程序主要取决于偏好(Notebook 和 Lab 都为编辑和运行笔记本提供了许多相同的功能)

  • Jupyter Notebook 提供了简化、轻量级的笔记本创作体验

  • JupyterLab 提供了一个可自定义、功能丰富、带选项卡的多笔记本编辑环境,并具有其他工具,如可自定义布局和系统控制台(程序员常用的工具)

  • 还有更多!

例如,教授可能会将 JupyterLab 用于日常数据分析工作,而在教学时使用 Jupyter Notebook,以便向学生提供笔记本内容更简单、更集中的视图。

ipython#

很久以前,创建了 Jupyter 的前身,称为 ipython(即将发布的文档“Jupyter 的历史”将对此进行更详细的介绍)。它提供了高级 REPL 功能,这些功能在 Jupyter 软件中仍然使用,因为它是与 JupyterLab 和 Jupyter Notebook 捆绑在一起的默认 Python 内核。

ipython 提供了一些其他命令,你可以在笔记本单元格中直接在 Python 代码旁边键入这些命令。在下面阅读有关其中一些功能的更多信息

有关 IPython 功能的更多详细信息,请查看 docs.jupyter.org > Projects > IPython

笔记本格式#

Jupyter 使用 .ipynb 文件格式将笔记本文件存储在你的计算机上(笔记本的数据和输出长期存储在那里)。.ipynb 格式由 nbformat 软件库解释和修改。

.ipynb 格式是一种 json 文档类型,它将你的笔记本单元格、程序输出和元数据保存在一个结构化的文本文件中。

JupyterHub#

JupyterHub 提供了一个多用户管理系统,许多不同的人可以登录并使用他们自己独立的笔记本编辑器程序和环境。

使用 JupyterHub,编辑和运行笔记本文件仍然由 Lab 或 Notebook 等编辑器程序执行。Hub 负责对用户进行身份验证,并为他们提供相应的 Lab/Notebook 实例连接。

JupyterHub 可以在不同的系统配置中设置

  • 在单台计算机中

  • 在计算机集群中

  • 在云中的容器中

JupyterHub 对于许多不同的多用户场景都非常灵活。

使用 ipywidgets 实现交互式按钮、滑块等#

Jupyter Widgets(也称为 ipywidgets)提供了交互式界面元素,你可以直接将其添加到笔记本中。

📘 注意:子项目已重命名为 Jupyter-Widgets,但 Jupyter-Widgets 和 IPyWidgets 实际上是同一件事。为了避免与旧代码的兼容性中断,该软件库仍称为 ipywidgets