什么是 Jupyter?#

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

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

“Jupyter”可以有很多含义,所以让我们从头开始,一步一步来

最重要的是,“Jupyter 项目”是一个涵盖许多不同软件产品和工具的庞大伞形项目。这包括 Jupyter NotebookJupyterLab,它们都是流行的笔记本编辑器程序。Jupyter 项目及其子项目都围绕着为交互式计算提供工具(和标准)而展开,这些工具使用计算笔记本。如果你对其中一些内容不熟悉,可以参阅下面的引导式介绍,它从头开始解释每一个内容。

“Jupyter”一词通常用作指代其中一个产品或概念的简称(这可能会引起混淆)。下面我们将逐一介绍每个部分,并提供一些说明。

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

一位著名的计算机程序员 (Donald Knuth) 普及了将解释性纯英文文本与计算机代码结合起来的想法,这通常被称为 文学编程通过采用这种做法,计算机程序以及其他复杂的信息和思想可以更好地向广泛人群解释。

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

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

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

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

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

  • 他们电脑上的一个笔记本文件

  • 将计算机代码、解释性文本、图像等组合成“笔记本格式”的想法

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

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

而“Jupyter”一词可能指的是

  • “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 服务器协调,稍后将详细介绍)。

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

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

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

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

这可能看起来是一个不必要的背景细节,但对内部工作原理的一些澄清可以帮助揭开笔记本创作体验的神秘面纱,并开启您可以利用的新功能、想法和工作流程。

多部分(模块化)方法对使用 Jupyter 软件的人和编写它的人也具有优势。

让我们看看其中一些部分

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

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

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

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

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

多部分设计的优点#

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

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

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

例如,JupyterCAD 是一个基于 Jupyter 软件构建的 3D 建模工具,还有其他示例

JupyterCAD 程序 上图: JupyterCAD 程序。

与内核通信(Jupyter 协议)#

任何人都可以通过使用 Jupyter 协议来制作与 Jupyter 内核通信的新软件(有关这些内容的更多信息,请参阅上文)。该协议提供了在内核与其他软件之间来回传递信息的标准化蓝图。

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

由于 Jupyter 项目是免费和开源的,它鼓励任何人探索使用其笔记本和内核的新方法,并且乐于提供与其他软件的兼容性和互操作性。

关于 Jupyter 项目我还需要了解什么?#

Jupyter 软件是免费和开源的,由全球志愿者和贡献者社区开发,造福所有人。

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 的历史”将更详细地介绍这一点)。它提供了至今仍用于 Jupyter 软件的高级 REPL 功能,因为它捆绑在 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