Skip to content

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 的改文件内容:

JSON
{
  "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

参考