将 Jupyter Notebook 用于 JavaScript (使用 Node.js 或 Deno 环境)
安装适用于 JavaScript 的 Jupyter Kernel 以获得更好的体验.

熟悉 Python 的读者, 可能同样对 IPythonJupyter 等项目 (如 Jupyter Notebook) 有所耳闻. 正如其名, IPython 项目让 Python 这门语言变得 “interactive”; 如: 交互式的 Shell 程序, 对交互式数据可视化以及 GUI 工具集的支持等等 (具体可见 IPython 项目的网站).

比如在 Notebook 中, 用户可以实现交互式的代码执行, 并将其和富文本, 数学公式, 图表以及多媒体等内容结合在一起. 想必体验过它的读者, 多少会对这种编写代码或者展示成果的模式, 有着这样那样的印象.

就笔者自己使用 Notebook 的体验来说, 在交互式的环境中进行开发和测试, 有着与在程序中设定断点相比更加直观灵活的数据查看体验, 也可以减少反复修改代码并重新执行的苦恼. 不过, Notebook 采用线性排列单元格的设计, 而并不限制单元格执行的顺序, 只是在单元格旁侧标注执行的次序号; 用户可以多次执行某个单元格中的代码, 或者修改单元格中的代码后再次执行. 如果使用不当, 则有可能在开发时, 失去对代码执行先后顺序的理解, 或者不小心对数据造成污染, 进而增加产生问题的可能.

随着 IPython 项目规模不断扩大, 自 IPython 4.0 开始, 其将项目中与语言关系不大的部分 — 比如 Notebook 的格式, 通信协议, 展示 Notebook 的 Web 应用等等 — 迁移到了以 Jupyter 为名的新项目下; IPython 项目则是提供一个 Python 语言的 Jupyter 内核, 专注于 “interactive Python (交互性的 Python)” (另见 Jupyter 项目的文档).

Jupyter 的名称来自于当时其支持的若干编程语言: Julia, Python 以及 R. 安装 Jupyter 时自带有 IPython 内核, 其为 Jupyter 提供针对 Python 程序的支持. 除了 IPython 之外, 目前还有 近百个社区维护的 kernel 可供选择, 其中不仅有针对 Bash, JavaScript / TypeScript 这样的脚本语言的内核, 对于像 C/C++ 和 Golang 这样的语言, 也有很多适配.

说回本文的话题, 其实在 Notebook 中, 可以使用 %%js 或者 %%javascript 这样的 magic command (魔法命令) 直接执行 (一些比较简短的) JavaScript 代码. 也可以参考这个 讨论 中提到的方式引入一些可能会需要的 JavaScript 包.

不过, 如果需要真正针对 JavaScript 语言的体验, 还是需要安装适用于 JavaScript 的 Jupyter Kernel. 本文将介绍基于 Node.jsIJavaScript 项目, 以及 Deno (一个较新的 JavaScript 运行时) 自带的 Jupyter 支持.

安装 Jupyter

既然要使用 Jupyter Notebook 等相关项目, 自然要先安装 Jupyter 项目的软件.

Jupyter 相关的软件可以通过 Python Package Index (PyPI) 获取并安装. 项目的 安装说明页 上给出了针对使用 pip 进行安装的说明, 并指出如果存在环境管理相关的需求, 可参见 conda, pipenv 以及 Homebrew 等项目.

Python 语言推荐使用 pip 从 PyPI 安装软件包, 同时可以使用 venv 来将不同项目的环境与共享使用的 Python 安装隔绝开来. 笔者这里也不建议使用额外的第三方软件, 以避免引入额外的复杂度.

Python 语言有若干种实现. 为了表述简便, 在无特殊说明时, 下文中的 Python 在指代语言本身外, 均代表常用的 CPython 实现.

安装时使用虚拟环境的必要性

在一些 Linux 发行版中, 系统自带有 Python 解释器, 直接使用 pip 安装软件包可能会写入这个系统目录下, 进而和系统包管理器产生冲突 (系统包管理器也可能会包含一些 Python 软件包). 此外, 包管理器中的 Python 软件包版本也可能较为滞后, 不适用于需要使用较新版本的情况. 因此, 建议使用独立于系统的 Python 安装 (通常需要自行编译), 或创建 “虚拟环境” (见下文), 再在其中安装自己需要的软件包.

而在 Windows 上, Python 的安装相对独立, 因此一般用户直接将软件包安装到 Python 环境下也并不会有特别的影响. Python 语言的安装器, 默认会将语言 (执行环境) 安装在用户的 %LocalAppData% 下 (笔者也建议这么做). 而 pip 安装软件包时, 默认也是根据 prefix 决定路径, 即 pip 对应 Python 安装的下方. 若用户在安装 Python 时, 将 Python 安装在了一些权限受限的地方 (如 %ProgramFiles% 目录下), 则 pip 会将软件包安装在用户的 %AppData% 中.

另请参见 “在 Windows 上使用 Python - docs.python.org”.

可以参考笔者的 上一篇文章 对此也有介绍.

直接安装在 Python 环境下

笔者在 Linux 下倾向使用较新的 Python 版本, 因此会使用独立的 Python 安装 (比如安装最新的 Python 3.12.0 在 ~/python3.12.0/ 目录下); 而在 Windows 上安装 Python, 类似于独立的 Python 安装. 这样的情况下, 可以尝试这种安装方式.

由于笔者认为 Jupyter 属于较为通用的软件, 并且通常不会作为可能的依赖影响其它项目, 因此决定直接将其安装在 Python 环境下.

于是, 在确定当前使用的具体 Python 安装 (以及 pip 安装) 的位置后, 直接使用 pip 安装 jupyter 即可.

根据需要, 可以使用 python -m 调用 pip, 或直接调用 pip (推荐前者). 需要注意, Linux 环境下可能需使用 python3pip3 代替 pythonpip.

这里笔者直接安装 Jupyter Lab (即 jupyterlab); 亦可仅安装 Jupyter Notebook (即 notebook).

python -m pip install jupyterlab
# /path/to/python -m pip install jupyterlab
pip install jupyterlab
# /path/to/pip insall jupyterlab

建立 venv 虚拟环境并在其中安装

Python 的 venv 模块可以创建轻量级的 “虚拟环境 (virtual environment)”, 每个虚拟环境中的软件包互不相干, 安装在各自的 site 目录下. 虚拟环境是基于某个现有的 Python 安装 — 称为 “基础 (base)” Python — 上建立的, 并且可以根据需要, 同样使虚拟环境与基础 Python 环境中的软件包隔开, 这样可以仅让显式在虚拟环境中安装的软件包生效.

从 Python 3.5 起, 便可以使用 Python 标准库中提供的 venv 模块创建虚拟环境. 比如, 在家目录下新建一个 jupyter 目录, 并在当前路径下的 venv 目录中建立一个基于当前 python 的虚拟环境:

mkdir ~/jupyter
cd ~/jupyter
python -m venv venv

之后启用这个虚拟环境, 并且在其中安装 jupyter (以在 Linux 平台下使用 bash 为例):

source venv/bin/activate
pip install jupyterlab

启动 Jupyter Lab

安装好后, 直接运行 jupyter lab 即可. 如果是本地运行, 直接在浏览器中访问命令输出中给出的链接即可. 亦可在远程设备上运行, 但要注意访问权限的控制.

关于 Jupyter 的概念介绍及使用, 本文不作展开, 可以参照附录中的文章进行操作.

安装 IJavaScript 内核

n-riesco/ijavascript 项目实现了一个可以在 Node.js 中执行 JavaScript 的 Jupyter 内核. 可以通过 npm 安装这个项目.

在 Linux 上, 这里假设使用的是通过 nvm 等项目而非系统包管理器, 为当前用户安装的 node 环境, 否则需要设置 npm prefix 在当前用户目录下.

通过 npm 安装 ijavascript 时, 需要原生构建, 因此在 Linux 下, 建议事先安装 build-essential 软件包.

sudo apt install build-essential
npm install -g ijavascript

之后运行 ijsinstall 即可完成安装. 详情参见项目 README.

完成安装后, 再次运行 Jupyter Lab, 即可见到对 JavaScript 的支持.

安装 Deno 及其 Jupyter 支持

目前 Deno 的 Jupyter 支持仍处于测试状态, 但这不影响我们尝鲜使用.

Deno 在 1.37 版本加入了对 Jupyter 的支持. 根据 Deno 的安装说明 完成安装后, 运行:

deno jupyter --unstable --install

即可完成 Jupyter Kernel 的安装.

由于 Deno 本身支持 TypeScript, 同时可以直接从 URL 引入 JavaScript 依赖, 因此具有非常好的灵活性. 详情可以参见 Bringing Modern JavaScript to the Jupyter Notebook.

另可参见 Deno 关于其 Jupyter 模块的文档: https://docs.deno.com/runtime/manual/tools/jupyter.


另请参见:


Last modified on 2023-10-10