如何在 运行ning 笔记本代码之前让我的 Jupyter 笔记本服务器 运行 任意 Python 代码?

How do I have my Jupyter notebook server run arbitrary Python code before running notebook code?

我正在尝试在我之前使用的名为 Odoo.sh 的平台上复制代码编辑器的功能。该平台可以让我创建一个 .ipynb 笔记本,但在单元格中我可以引用不需要笔记本内部样板代码的预设变量。非常方便。

如果您熟悉 Odoo,这就像在执行笔记本中的任何单元格之前让 odoo-bin shell 隐式 运行 一样。使用起来很棒,但是 Odoo.sh 是专有的,所以我试图在我的本地机器上复制相同的功能。

我在这里要做的一个最小例子是在执行我的 .ipynb 笔记本文件的任何单元格之前有以下 python 代码 运行。

example_value = False

def example_func():
    global example_value
    example_value = True

example_func()

因此,在任何笔记本的单元格内,我可以简单地 运行 类似 example_value 的内容,并获得 True.

的输出

在 Odoo.sh 的情况下,似乎有一个特殊的自定义内核设置,只不过是带有一些初始化代码的常规 Python 3 内核。这可能正是正在发生的事情,但我对 Jupyter 的工作方式知之甚少,无法亲自了解。我如何复制此功能?

我想通了!您需要创建一个自定义内核,但对于此用例,您可以重用默认 IPython 内核并将一些变量传递到用户命名空间。

首先,为您的内核创建一个 Python 文件。让我们使用 test_kernel.py。内容如下:

from ipykernel.ipkernel import IPythonKernel 
from ipykernel.kernelapp import IPKernelApp


if __name__ == "__main__":
    example_value = False

    def example_func():
        global example_value
        example_value = True

    example_func()

    IPKernelApp.launch_instance(
        kernel_class=IPythonKernel,
        user_ns={"example_value": example_value})

在启动内核实例之前查看问题中的任意代码是如何 运行 的。使用 user_ns 参数,我们可以将任意数据传递给用户环境。

为了启动我们的内核并 运行ning 我们需要创建一个 test 目录,然后是一个 test/kernel.json 文件。它将包含以下内容:

{
  "argv": ["python", "-m", "test_kernel", "-f", "{connection_file}"],
  "display_name": "Test"
}

让我们安装那个坏男孩。 运行 jupyter kernelspec install --user test。在该命令中,test 是我们创建的目录的名称。 --user 参数让 Jupyter 只为当前用户安装内核。不想用也可以不用。

现在我们应该可以开始了!使用 jupyter notebook 启动,您将看到您的新内核可以在使用笔记本时使用。检查一下,我们可以看到我们传入命名空间的变量:

最后,请务必注意,为了使其正常工作,您的 test_kernel.py 文件需要位于 Python 可以导入它的位置。我不是这方面的专家,但是通过一些谷歌搜索,我认为这意味着包含该文件的目录应该是当前工作目录或者在您的 PYTHONPATH.