如何在 运行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
.
中
我正在尝试在我之前使用的名为 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
.