将 jupyter 笔记本连接到现有且正在运行的 ipython 内核

问题描述 投票:0回答:1

简短版本:我有一个运行自己的jupyter内核的软件。我想从外部源连接到这个正在运行的内核。这与

--existing
jupyter console
选项配合使用效果很好,但
jupyter notebook
没有这样的功能。

我的问题或多或少是这样的:如何将 jupyter 笔记本连接到现有的 IPython 内核?但软件包显示不再正常工作。我对它做了一些代码更改以使其“工作”,但我仍然遇到问题。

上下文:我有一个嵌入了python3版本的软件。这包括通过这个嵌入式 python 提供的一堆 C++ 扩展(以额外的内置模块的形式)。这些只能通过随软件启动的嵌入式 python3 获得,并可用于以各种方式与软件交互(例如,类似于 Blender 中的

bpy
包)。它还包括一堆模块(了解 numpy、pandas、matplotlib 和许多其他模块等...)

为了方便开发,我将这个嵌入式 python 和所有模块“公开”为 jupyter 内核。我可以使用

jupyter console --existing  kernel-<id>.json
成功从外部连接到它,并访问所有模块并使用它们与软件交互。

问题: 笔记本或代码/脚本等效项没有

--existing
选项。

我找到的一个解决方案(这里提到的模块使用的解决方案:如何将 jupyter 笔记本连接到现有的 IPython 内核?)包括拥有一个自定义内核管理器类,然后您可以使用

jupyter notebook --NotebookApp.kernel_manager_class=extipy.ExternalIPythonKernelManager --Session.key='b""'
设置它。它通过覆盖
start_kernel
来工作,正如它所说: “它通过调用 super().start_kernel(...) 启动一个新内核,但随后将注意力转向由外部 python 进程启动的内核. 内核重新启动将会 重新启动无用的内核并保留现有内核。”

这是核心文件 ExternalIPythonKernelManager 文件,但我想,由于 jupyter 的更改,它现在失败了(

super(ExternalIPythonKernelManager, self).start_kernel(**kwargs).result()
失败,因为协程没有
.result()
)。这是我“有效”的
start_kernel
版本:

    async def start_kernel(self, **kwargs):
        kernel_id = await super(ExternalIPythonKernelManager, self).start_kernel(**kwargs)
        if self._should_use_existing():
            self._attach_to_latest_kernel(kernel_id)
        return kernel_id

但是跑步

jupyter notebook --NotebookApp.kernel_manager_class=extipy.ExternalIPythonKernelManager --Session.key='b""'
现在让我变得

[I 14:33:17.997 NotebookApp] Kernel started: cdaf10a1-6af9-4f09-9e6f-c6298a0bb16e, name: python3
[IPKernelApp] ERROR | No such comm target registered: jupyter.widget.control
[IPKernelApp] WARNING | No such comm: 8563966b-82ac-4f35-8f9b-a98fceaf5f64

当我转到笔记本时,我的自定义 Ipython 内核不可用,只有默认的“Python 3”内核。

问题:

  • 知道可能出了什么问题吗?我用基于
    tornado
    的代码替换不工作的
    async/await
    特定代码会不会有问题?
  • 还有其他方法可以连接到 Jupyter Notebook 的现有内核吗?
python jupyter-notebook jupyter tornado jupyter-kernel
1个回答
0
投票

正如这里提到的,您可以通过使用

--KernelProvisionerFactory.default_provisioner_name=pyxll-provisioner
来重用现有内核。

例如:

STARTUP_CODE="a = 42"

export PYXLL_IPYTHON_CONNECTION_FILE="$(mktemp -d)/connection-file.json"

(printf "%s\n" "$STARTUP_CODE" && sleep infinity) | 
jupyter console --kernel=python3 -f="$PYXLL_IPYTHON_CONNECTION_FILE" &
jupyter notebook --KernelProvisionerFactory.default_provisioner_name=pyxll-provisioner --log-level=ERROR

jupyter console
执行
a = 42
并保留内核,然后所有
jupyter notebook
内核将重用现有内核,其中
a
被初始化为开箱即用的
42

© www.soinside.com 2019 - 2024. All rights reserved.