简短版本:我有一个运行自己的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
特定代码会不会有问题?正如这里提到的,您可以通过使用
--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
。