Kernel
内核是真正用于执行 code 的组件,他通过jupyter-client提供的 Jupyter messaging protocol(Jupyter 消息协议)来与客户端进行通信。
Jupyter 官方维护了一个IPython项目,该项目默认使用内核ipykernel,他用于执行 Python 程序。Jupyter 还提供了Xeus库来简化 Jupyter 内核的实现,他也促生了很多社区维护的内核。
Tips
Jupyter 项目脱胎自 IPython 项目,实际上 IPython 是能够修改内核 ipykernel 来执行其他程序的。
Tips
官方提供了详细的说明来介绍如何制作内核
安装内核
内核本质上就是一个命令程序,Jupyter 会自动从下面的目录中去寻找内核:
| Unix | Windows |
| ------ | ------------------------------------------------------------------------- | ------------------------------------ |
| System | /usr/share/jupyter/kernels
//usr/local/share/jupyter/kernels
| %PROGRAMDATA%\jupyter\kernels
|
| Env | {sys.prefix}/share/jupyter/kernels
| {sys.prefix}\share\jupyter\kernels
|
| User | ~/.local/share/jupyter/kernels
(Linux)//~/Library/Jupyter/Kernels
(Mac) | %APPDATA%\jupyter\kernels
|
内核制作者也会将内核程序安装到对应的位置(或者执行一个脚本来完成)来让 Jupyter 自动发现。
Tips
如果安装了虚拟环境会不太一样,例如 conda 环境中通常会保存在 $CONDA_PREFIX/share/jupyter/kernels
下
对应目录下铜锤包含 kernel.json/kernel.js/logo.png
三个文件,其中最为核心的就是 kernel.json
文件,改文件包含几个键:
argv: list
: 启动内核时使用的命令行参数雷表,也是最核心的参数display_name
: UI 上显示的内核名称language
: 内核的语言名称interrupt_mode
: 可选,中断模式。指定客户端如何终端此内核的单元格执行env
: 可选,设置内核的环境变量metadata
: 可选,附加在内核上的属性字典
例如 python 的改文件内容:
{
"argv": [
"/home/ygd/.conda/envs/jupyter/bin/python",
"-Xfrozen_modules=off",
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}"
],
"display_name": "Python 3 (ipykernel)",
"language": "python",
"metadata": {
"debugger": true
}
}
Tips
说白了就是通过 python 运行了 ipykernel_launcher 模块来提供服务。
内核管理
可以使用 jupyter kernelspec
来管理内核:
list
: 列出所有已经安装的内核,实际上就是扫描上面的路径来查找所有的kernel.json
文件install
: 安装内核,主要用于内核调试uninstall/remove
: 卸载内核
Tips
Jupyter 还提供了一个 jupyter kernel
命令,他用于独立运行内核
常用内核
- Ilua: Lua 内核,区别与其他特定于 Lua 版本的内核该内核通过 IPC 来与系统环境的任何版本的 Lua 进行通信
- tslab: JavaScript/TypeScript 内核,基于 Nodejs