向IPython内核发送其他语言的消息

12

有人有在Python以外的环境中与IPython内核进行通信的经验吗?

如果我要从Python应用程序向IPython内核发送消息,我会使用zmq.kernelmanager API。由于现在我需要用另一种语言编写自己的内核管理器,但是我找不到关于低级消息传递协议的信息。

是否有官方规范或“速查表”记录了通过0MQ发送的实际消息的结构?此页面描述了比我要寻找的更高级的协议...我是否必须手动分解实现才能找到我想要的内容?


有一篇博客文章链接到这个问题,描述了如何实现一个IPython内核。https://dev59.com/MGQo5IYBdhLWcg3wMtC2 - dirceusemighini
1
http://andrew.gibiansky.com/blog/ipython/ipython-kernels/ 是@dirceusemighini所提到的内容。 - user2388535
1个回答

13
这是一份必须存在的文档,但是线路协议的实现是在单个对象中实现的,所以从那里理解起来不应该太难。你提供的消息规范文件涵盖了每个字段的应用层内容,但不涉及它们如何在zeromq上进行序列化。假设你有一条消息,就像在该文档中描述的那样,线路格式非常简单。它是一个包含至少六个部分的多部分zeromq消息:
  • 前导消息部分是zeromq路由标识符(零到多个)
  • 然后跟隔离消息,字节为<IDS|MSG>
  • 消息的hmac digest(如果未启用身份验证,则为空字符串''
  • header
  • parent_header
  • metadata
  • content

headerparent_headermetadatacontent 在消息文档中都有描述 - 它们都是字典,并使用当前使用的序列化方式序列化为字节。在 IPython 中,默认为 utf8 编码的 JSON,但允许任意序列化(msgpack 是最常见的非默认序列化)。尚未在文档中描述的是用于身份验证的 digest。这是消息的 MD5 HMAC Digest。摘要密钥可以在连接文件的 key 字段中找到。HMAC 摘要使用的“消息”是按发送顺序连接序列化的头、父头、元数据和内容的字节。

您可以通过指定配置值来禁用消息签名

Session.key = ''

如果涉及到您代码中与IPython相关的部分,那么摘要字段将始终为空字符串''。我建议在开始时就这样做,这样您就可以先解决实现的更有趣的部分。

以下是IPython实际发送的示例执行请求及其回复。

请求内容:

[
  <IDS|MSG>
  6ea6b213262402cc1ad3c1d3e342a9f6
  {"date":"2013-04-27T23:22:13.522049","username":"minrk","session":"5b03b89a-93c9-4113-bb85-17ba57233711","msg_id":"c6d0f85e-fc25-4f1e-84e1-3d706b615393","msg_type":"execute_request"}
  {}
  {}
  {"user_variables":[],"code":"1\n","silent":false,"allow_stdin":true,"store_history":true,"user_expressions":{}}
]

及其回复:

[
  5b03b89a-93c9-4113-bb85-17ba57233711
  <IDS|MSG>
  47d1052f6e8f333d18480938ca91719b
  {"date":"2013-04-27T23:22:13.528239","username":"kernel","session":"d7eb303b-d2d0-4723-aef2-738545a8da11","msg_id":"9ed1d332-398c-4132-b203-1e7bf8fed712","msg_type":"execute_reply"}
  {"date":"2013-04-27T23:22:13.522049","username":"minrk","session":"5b03b89a-93c9-4113-bb85-17ba57233711","msg_id":"c6d0f85e-fc25-4f1e-84e1-3d706b615393","msg_type":"execute_request"}
  {"dependencies_met":true,"engine":"645fb29f-37ab-40c9-bc01-b7fbfe3c2112","status":"ok","started":"2013-04-27T23:22:13.524114"}
  {"status":"ok","execution_count":2,"user_variables":{},"payload":[],"user_expressions":{}}
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接