什么是 Jupyter?#
上图所示: JupyterLab 中的一个笔记本,显示胰岛素受体的交互视图。
📘 关于: 本文档解释了Jupyter生态系统中的基本概念和软件。
"Jupyter" 可以指代很多东西,所以让我们从头开始,一步一步来:
最重要的是,“Project Jupyter”是一个涵盖许多不同软件产品和工具的大型项目。这包括Jupyter Notebook和JupyterLab,它们都是受欢迎的笔记本编辑器程序。Jupyter项目及其子项目,都围绕着为 使用计算笔记本的交互式计算提供工具(和标准)。 如果你对其中的一些内容不熟悉,你可以参加下面的引导之旅,从基础开始解释每一个内容。
术语“Jupyter”通常被用作指代这些产品或想法的简称(这可能会引起混淆)。让我们逐一看看每个部分,并在下面提供一些清晰度。
什么是“计算笔记本”呢?#
一位著名的计算机程序员(Donald Knuth)推广了将解释性的纯英文文本与计算机代码结合的想法,这通常被称为文学编程。通过采用这种实践,计算机程序以及其他复杂的信息和想法可以更好地向广大人群解释。
以这种方式编写的程序可以打印在纸上并通过手写共享为实际的“笔记本”,但在现代,它们以“笔记本文件”的形式进行数字共享,并且可以包含额外的富媒体,如图像、3D 模型和交互式图形,以及数据和其他程序输出。
通过使用像 JupyterLab 这样的编辑器程序打开一个笔记本,你还可以运行笔记本内的代码。由于笔记本可以包含几乎任何代码,你可以在笔记本内完成几乎所有常规软件能做的事情。例如,一个笔记本文件可能用于:
读取电子表格(或创建它们)以构建关于家庭支出的报告
通过交互式图表和源数据展示你的大学论文证明
处理天文数据 来自詹姆斯·韦伯太空望远镜(JWST)
通过处理望远镜数据生成一个黑洞图像
计算从天文台数据中 引力波 的存在
最后三个是现实世界的例子,展示了科学界对计算笔记本的使用。因为科学家、工程师和其他技术人员经常需要执行和交流复杂的计算来描述他们的工作,这些“计算笔记本”成为分享他们的工作和想法的一种非常流行的方式。
笔记本不仅仅是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 等待程序员编写另一个代码片段来执行。
新的代码片段可以引用在先前的 Eval 步骤中定义的变量,因为 REPL 会将在内存中创建的对象(通过循环的先前运行)保留,直到用户关闭他们的 REPL。
内核#
像 JupyterLab 这样的笔记本编辑器程序会为每个打开的笔记本文件创建一个 REPL(更多信息请参见上文),使用您选择的语言。在 Jupyter 生态系统中,这些 REPL 中的每一个都被称为内核,它持有您在笔记本代码中创建的数据和对象,并在您的计算机上作为一个长时间运行的程序(这些内核的管理和创建由 Jupyter Server 协调,稍后会详细介绍)。
这就是为什么当你连续执行多个笔记本单元格时不会丢失数据和变量,它们在REPL中保持活动状态,以便你可以继续使用它们来探索你正在研究的数据和问题(尽管如果你关闭了持有内核的Jupyter服务器,你将丢失这些变量)。
在每个笔记本后台运行的内核是驱动 Jupyter 笔记本编辑器程序擅长的高效、探索性编程工作流程的关键。
多个程序,一种体验(客户端-服务器架构)#
在Project Jupyter中的大多数Notebook编辑程序,如JupyterLab,可能看起来像是一个单一的体验,但当你在笔记本电脑上运行JupyterLab时,实际上有多个程序在独立运行,它们相互协调,为你提供你可能已经熟悉的Notebook编辑体验。
这可能看起来像是一个不必要的背景细节,但对内部工作原理的一些清晰了解可以帮助揭开你的笔记本创作体验的神秘面纱,并开启你可以利用的新功能、想法和工作流程。
多部分(模块化)方法对使用 Jupyter 软件的人以及编写它的人也有优势。
让我们来看看其中的一些部分:
JupyterLab 的界面是一个在浏览器程序中打开的网页应用,比如 FireFox 或 Google Chrome(网站本身通常有定义其行为的代码,JupyterLab 的界面也不例外)。
Jupyter Server 在后台运行,并在您运行笔记本时协调笔记本内核的创建、管理和通信。
Jupyter 内核本身是独立的程序(操作系统进程),每个内核都是您请求的任何语言中的独立 REPL(通常是 Python,尽管还有数百种其他语言和内核 也可用)。
通过这种设计,任何(你启用的)程序都可以使用HTTP等常见的互联网通信技术与你的内核进行通信。这使你能够在许多不同的程序中编辑、查看、共享和操作你的数据。一个内核甚至可以同时连接到多个编辑程序!(同样,在JupyterLab中,你可以将笔记本和控制台连接到同一个内核!)
Project Jupyter 实际上定义了一个 标准,其他程序可以遵循该标准,以便以几乎任何你能想象到的方式与你的内核连接。通过使用内核提供的交互式计算能力,你可以通过这种方式为你的数据创造新的编辑和查看体验。
多部件设计的优势#
通过将 JupyterLab 这样的程序分解成多个组件部分,你可以根据需要定制软件。如果某个部分缺少某些功能,你可以用自己或其他人的定制版本来替换它,以添加你希望看到的任何功能。
你也可以利用这些设计师在开始时可能没有想象到的部分,创造全新的体验,这些体验通常可以与现有的 Jupyter 软件无缝地相互操作。
因为 Jupyter Server 在一个紧密、自包含的包中提供了内核通信和管理功能,例如,新的笔记本编辑器程序可以专注于添加新的界面和编辑体验,而将创建和管理新内核的任务完全交给 Jupyter Server。
JupyterCAD 是一个基于 Jupyter 软件构建的 3D 建模工具,例如,还有 其他例子。
上图所示: JupyterCAD 程序。
与内核对话 (Jupyter 协议)#
任何人都可以通过使用 Jupyter 协议 来创建与 Jupyter 内核(更多信息请参见上文)通信的新软件。该协议提供了一个标准化的蓝图,用于在各个内核和其他软件之间来回传递信息。
通过实现 Jupyter 协议中描述的设计,你可以创造一个全新的交互式编程体验,或者为 Jupyter 添加对一种新编程语言的支持。
由于 Project Jupyter 是免费且开源的,它鼓励任何人探索使用其笔记本和内核的新方法,并喜欢提供与其他软件的兼容性和互操作性。
关于 Jupyter 项目,我还应该知道什么?#
Jupyter 软件是免费且开源的,由全球志愿者和贡献者社区开发,旨在惠及所有人。
Project Jupyter 欢迎来自所有背景和拥有各种技能(不仅仅是软件!)的人,因此我们鼓励您加入我们!您可以直接向制作 Jupyter 软件的人分享您的体验反馈,或者自愿贡献,以多种不同的方式帮助 Jupyter,例如:
测试新发布的版本
编写教程
添加软件功能
举办每周视频会议
帮助社区中的其他人
在 Jupyter Discourse 论坛 寻求帮助或提供帮助
...还有更多!
该项目被划分为大致独立的子项目,这些子项目负责处理Jupyter软件和社区的不同方面。一个中央委员会,即Jupyter执行委员会,负责制定项目范围的目标和政策,而不同的子项目则负责实际开发各种软件组件。
一些子项目负责更广泛的主题,例如 Accessibility、Security、Community 和 Documentation 项目。
Jupyter 宇宙的(部分)之旅#
在接下来的章节中,我们将探讨 Jupyter 生态系统中的一些流行组件。这不是 Jupyter 各个方面的全面参考,而是一个大图景的总结,应该有助于阐明之前讨论过的一些重要部分。
如果你对 Jupyter 完全陌生,项目的 关于 页面是一个很好的阅读材料,它将向你介绍许多不同的子项目。
如果你想了解更多关于组织结构的信息,请查看 治理 页面。
如果你想为项目做出贡献,请查看 Get Involved 页面。
下图展示了项目中已知最佳的软件组件。
本图中的连接和组不是正式的关系,而是简单的指示器,帮助我们在下一部分绘制整体图景。
笔记本编辑器程序#
The JupyterLab 笔记本编辑器
Jupyter Notebook 笔记本编辑器
Project 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 对于许多不同的多用户场景非常灵活。