如何启动 IPython 内核并使用 ZMQ 套接字进行连接?

Posted

技术标签:

【中文标题】如何启动 IPython 内核并使用 ZMQ 套接字进行连接?【英文标题】:How to start IPython kernel and connect using ZMQ sockets? 【发布时间】:2016-08-20 15:32:30 【问题描述】:

我正在使用 C++ (Qt) 开发 IPython 的前端。

我设法将 Python 嵌入到我的应用程序中,并检索绘图并将其显示在我的 GUI 中。现在我想启动一个 IPython 内核并通过 ZMQ 套接字连接到它。

我找到了一个description 用于 IPython 内核的通信协议。但是,它并没有说明 anywhere 要连接到哪些端口。所以有一个通信协议很好,但如果我不知道要使用哪些端口,那就完全没用了。

文档提到“内核规范”并告诉我使用jupyter kernelspec list 命令。这确实向我展示了一个目录,其中仅包含两个文件:logo-32x32.png 和 logo-64x64.png ...

如何找到我需要连接的端口,以便与我的 IPython 内核进行通信?

我通过从我的 C++ Qt 应用程序运行以下 Python 代码来启动我的 IPython 内核:

import IPython
IPython.start_kernel(argv=[])

【问题讨论】:

看看我的ipy_repl.py 更新版本,来自SublimeREPL 插件,用于Sublime Text 编程编辑器。那里没有特定于 Sublime 的 API 东西。基本上,它适用于高达 4.1.1 的 IPython 和高达 4.1.0 的 jupyter_console(它似乎不适用于更高版本的 IPython 4 或 5 的任何版本)以在 Sublime 视图中设置连接并运行IPython/Jupyter 内核,包括利用其自动完成功能。 start_kernel 在当前进程中启动内核。听起来您想要的是一个单独的进程中的内核,您可以从应用程序进程连接到该内核。为此,您将使用 jupyter_client 模块。你可以看看像 Spyder 这样的应用程序,看看它们做了什么。 【参考方案1】:

事实证明,Thomas K 是对的。在不同进程中启动 IPython/Jupyter 内核的正确方法是:(以 python3 为例)

import jupyter_client
kernel_manager, kernel_client = jupyter_client.start_new_kernel(kernel_name='python3')

当我最初尝试这个时,我得到了一个权限错误。这已通过安装 python3 内核规范修复(显然 Jupyter 不会自动执行此操作...):

python3 -m ipykernel install --user

然后你可以通过

print(kernel_manager.get_connection_info())

应该可以使用这些端口通过 zero-mq 连接到内核。但是,kernel_client 公开了一些与内核通信的方法,因此使用该方法可能更容易......

【讨论】:

以上是关于如何启动 IPython 内核并使用 ZMQ 套接字进行连接?的主要内容,如果未能解决你的问题,请参考以下文章

在 ZMQ 中创建多个套接字 - 文件过多错误

ZeroMQ发布-订阅模式(套接字类型ZMQ_PUBZMQ_SUBZMQ_XPUB等)

ZeroMQ API 代理

如何解决“VisibleDeprecationWarning:zmq.eventloop.minitornado 已弃用”?

启动ipython内核发生错误,在Spyder的IPython控制台中启动内核时出现PermissionError

ZMQ 套接字不是线程安全的,但我可以在不同的线程中使用 zmq_send() 和 zmq_recv() 吗?