将来自其他语言的消息发送到IPython内核

Ben*_*son 12 python messaging protocols ipython zeromq

有没有人有从Python外部与IPython内核通信的经验?

如果我试图将消息从Python应用程序发送到IPython内核,我会使用zmq.kernelmanagerAPI.实际上,我显然需要用另一种语言编写自己的内核管理器,但是我找不到我正在寻找的有关低级消息传递协议的信息.

是否有官方规范或"备忘单"记录了在0MQ上发送的实际消息的结构?这个页面描述的是比我正在寻找的更高级别的协议......我是否必须手动拆分实现以找到我想要的内容?

min*_*nrk 13

这是一个绝对需要存在的文档,但是有线协议的实现是在一个对象中实现的,因此从那里开始不应该太难.您链接的消息规范文档涵盖了每个字段的应用程序级内容,但不包括它如何通过zeromq实际序列化.假设您有一个消息,如该文档中所述,有线格式非常简单.它是至少六个部分的多部分zeromq消息:

  • 主要消息部分是zeromq路由标识(零到多)
  • 接下来是带有字节的分隔符消息 <IDS|MSG>
  • digest消息的hmac (''如果禁用身份验证,则为空字符串)
  • header
  • parent_header
  • metadata
  • content

header,parent_header,metadata,和content都在消息文档描述-这是字典,和序列化到与任何串行化是目前使用的字节.IPython中的默认值是utf8编码的JSON,但允许任意序列化(msgpack是最常见的非默认值).尚未在文档中描述digest,用于身份验证.这是消息的MD5 HMAC摘要.摘要的密钥key位于连接文件的字段中.HMAC摘要使用的"消息"是序列化标头,parent_header,元数据和内容的字节串联,其顺序与通过线路发送的顺序相同.

您可以通过指定配置值来禁用邮件签名

Session.key = ''
Run Code Online (Sandbox Code Playgroud)

到代码中与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":{}}
]
Run Code Online (Sandbox Code Playgroud)

及其答复:

[
  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":{}}
]
Run Code Online (Sandbox Code Playgroud)