简介
Jupyter 是什么?
Jupyter(发音 /ˈdʒuːpɪtər/ )是一个开源的交互式计算(interactive computing)项目,起源于数据科学和科学计算领域,目的是为用户提供一种整合代码、文档、数学公式和可视化的直观工具。它的历史可以追溯到 IPython 项目,逐步演变为如今广泛使用的 Jupyter 生态系统。
- Jupyter 的名称源于其所支持的三种核心编程语言,即 Julia、Python 和 R。
- 它的名字和标志是对伽利略(Galileo)发现木星(Jupiter)卫星的致敬。
一个典型的 Jupyter Notebook 文件的后缀是 .ipynb,它由一系列的 单元格(Cell) 组成,主要分为以下两种类型:
- 代码单元格(Code Cell):
- 用于编写代码。
- 支持即时运行,并在单元格下方显示结果。
- Markdown 单元格(Markdown Cell):
- 用于编写文档,支持 Markdown 语法。
- 可以插入标题、文本、列表、公式(LaTeX 语法)等。
历史
- 2001 年:IPython 项目诞生,由 Fernando Pérez 开发,作为增强版的 Python 交互式命令行工具。
- 2011 年:发布 IPython Notebook,支持代码、文本、数学公式和可视化的集成开发环境。
- 2014 年:IPython Notebook 更名为 Jupyter Notebook,支持多种语言(如 Python、R、Julia)。
- 2015 年:Jupyter Notebook 在数据科学和教学领域迅速普及,成为主流工具。
- 2018 年:推出 JupyterLab,作为下一代用户界面,支持更复杂的项目开发。
- 2023 年:发布 Jupyter Notebook 7,基于 JupyterLab 技术栈,升级经典 Notebook。
安装
安装 jupyterlab
通过
1 |
|
或者
1 |
|
安装完成后,在site-packages下会有如下一堆包
模块 | 功能简介 |
---|---|
jupyter_client | 管理前端与 Kernel 的通信。 |
jupyter_core | 提供核心配置和工具,是整个生态的基础模块。 |
jupyter_events | 处理事件流和内部通信。 |
jupyter_lsp | 提供语言服务器协议支持,增强代码编辑体验(如补全、检查)。 |
jupyter_server | 核心服务器,管理文件系统、Kernel 会话和 REST API。 |
jupyterlab | JupyterLab 的前端界面,提供现代化的交互式开发环境。 |
jupyterlab_server | 支持 JupyterLab 的扩展和静态文件服务。 |
jupyterlab_pygments | 提供代码语法高亮功能,基于 Pygments 实现。 |
在Scripts下,更是一堆可执行程序(以Windows为例),比如:
- jupyter.exe
- jupyter-dejavu.exe
- jupyter-kernel.exe
- jupyter-kernelspec.exe
- jupyter-lab.exe
- jupyter-labextension.exe
- jupyter-labhub.exe
- jupyter-migrate.exe
- jupyter-nbconvert.exe
- jupyter-run.exe
- jupyter-server.exe
- jupyter-troubleshoot.exe
- jupyter-trust.exe
执行如下命令,会调用jupyter-lab 来启动浏览器界面
1 |
|
安装 jupyter-console
jupyter-console 是 Jupyter 提供的一个 基于命令行的交互式计算环境,它允许用户通过终端(或命令行)直接与 Jupyter Kernel 进行交互。
安装:
1 |
|
执行:
1 |
|
特点:
- 无需图形界面,比 Jupyter Notebook 或 JupyterLab 的图形界面更轻量。
- 类似于 IPython,但支持 Jupyter 的多语言 Kernel
安装 qtconsole
QtConsole 是 Jupyter 生态系统中的一个 图形化的交互式控制台,提供了类似于命令行的界面,但比终端更强大、更直观。它基于 Qt 框架开发,支持丰富的功能,包括代码高亮、内嵌图形显示、Markdown 渲染等。
安装(它依赖于PyQt或PySide):
1 |
|
运行:
1 |
|
安装 notebook
安装:
1 |
|
运行
1 |
|
.ipynb
.ipynb 是 Jupyter Notebook 的文件格式,全称是 "Interactive Python Notebook"。它是 Jupyter Notebook 使用的核心文件类型,支持 代码、文本、图表 和 交互式内容 的组合,是一种用于交互式计算的文档格式。
.ipynb 文件的结构是基于 JSON(JavaScript Object Notation) 的纯文本文件。它可以分为以下几个部分:
- cells:存储每个单元格的内容,包括代码、Markdown 文本等。
- metadata:Notebook 的全局元数据,例如 Kernel 和语言信息。
- nbformat 和 nbformat_minor:文件格式的版本号。
- outputs:存储代码单元的执行结果,包括文本输出、图形、错误信息等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
|
方括号?
方括号中的数字表示该单元格 被执行的顺序。每次运行一个代码单元时,Jupyter 会为其分配一个递增的执行计数。
例如:
- 第一个运行的单元格显示
[1]
。 - 第二个运行的单元格显示
[2]
。 - 第三个运行的单元格显示
[3]
。 - 如果单元格 未被运行过,方括号会显示为空白:
[ ]
。 - 如果 再次运行 某个单元格,数字会更新为最新的执行顺序。如果之前某个单元格的方括号是
[2]
,再次运行后会更新为当前的执行计数(如[5]
)。 - 如果 重新启动 了 Kernel,所有的执行计数会重置。所有单元格的方括号会变成
[ ]
,表示未执行。
魔法指令
Jupyter的魔法命令(Magic Commands)用于简化操作和扩展 Notebook 的功能。分为两种类型:
行魔法命令(Line Magics)
- 以单个 % 开头。
- 只作用于当前 行。
- 一行中只能包含魔法命令。
魔法命令 | 功能 |
---|---|
%time |
测量 一行代码 的执行时间。 |
%timeit |
多次运行 一行代码 并测量平均执行时间。 |
%pwd |
显示当前工作目录。 |
%ls |
列出当前目录中的文件和文件夹。 |
%env |
列出当前环境变量。 |
%who |
列出当前会话中的变量。 |
%pip install |
安装 Python 包(等同于在终端中运行 pip install )。 |
%debug |
进入调试模式。 |
... |
.... |
单元魔法命令(Cell Magics)
- 以两个 %% 开头。
- 作用于整个 单元格。
- 单元格中可以包含多行代码或指令。
魔法命令 | 功能 |
---|---|
%%time |
测量 整个单元格 的执行时间。 |
%%timeit |
多次运行 整个单元格 并测量平均执行时间。 |
%%writefile |
将单元格中的内容写入一个文件中。 |
%%capture |
捕获单元格中的输出(标准输出和标准错误),可以保存到变量中。 |
%%bash |
在单元格中运行 Bash 命令。 |
%%HTML |
渲染 HTML 代码。 |
%%latex |
渲染 LaTeX 代码。 |
%%script |
在单元格中运行不同语言的脚本(如 Python、Ruby、Perl 等,需安装对应的内核)。 |
... |
.... |
Shell 命令
在 Jupyter 中,还可以使用以 ! 开头的命令。这些命令并不属于 Jupyter 的魔法命令(Magic Commands),而是调用系统的 Shell 环境执行命令。
比如:
1 2 3 |
|
扩展?
- https://github.com/jupyterlab/extension-examples
- https://jupyterlab.readthedocs.io/en/4.2.x/user/extensions.html
在 jupyter lab 启动的界面中,可以查看和安装扩展
如果,在命令行下,那么
查看已安装扩展:
1 |
|
安装扩展,使用pip或conda,比如:
1 |
|
注意事项
内核管理(Kernel)
Jupyter Notebook 的代码执行依赖一个运行中的 内核(Kernel),它的状态会直接影响 Notebook 的运行。
- 所有单元格共享一个内核(即所有变量、函数、导入的模块在内核中是全局可见的)。
- 变量的值会随着单元格的执行而变化,即使重新运行某些单元格,之前的变量值可能仍然存在。
- 重启内核后,所有之前运行的变量都会消失,需要重新运行相关单元格。
单元格的运行顺序
Jupyter Notebook 的单元格可以按任意顺序运行,这可能导致代码之间的依赖关系出现问题。
- 从头运行所有单元格:使用 Kernel > Restart & Run All,确保代码按正确顺序运行。
- 保持单元格的逻辑性:将相互依赖的代码放在相邻的单元格中,便于维护和运行。
文件路径问题
Notebook 的工作目录(当前路径)是启动 Jupyter 的目录,而不是 Notebook 文件所在的目录。
- 相对路径问题:在 Notebook 中使用相对路径加载文件(如 data/file.csv),路径是相对于运行 Jupyter 的工作目录,而不是 Notebook 的文件位置。
- 切换路径可能引发混淆:如在 Notebook 中切换了 os.getcwd(),后续路径引用可能会出错
参考
- https://jupyter.org
- https://github.com/jupyter
- https://en.wikipedia.org/wiki/Project_Jupyter
- https://jupyterlab-contrib.github.io/migrate_from_classical.html