Erlang中的IPython语言内核实现

时间:2014-04-01 09:39:45

标签: python erlang ipython zeromq

我目前正在为IPython构建一个Erlang语言内核后端,我正在控制台中测试它。

我的工作:

  • 启动ipython控制台和erlang内核
  • Erlang内核读取kernel.json文件的内容,该文件包含zmq
  • 的所有端口号
  • 使用erlzmq2库为shellheartbeatcontroliopub套接字创建zmq绑定。
  • 创建函数来解析来自IPython的消息
  • 为心跳服务器创建一个运行流程并将消息返回给IPython
  • 为Shell Socket创建了一个进程,以接收和响应以下消息
    • kernel_info_request - > kernel_info_reply
    • execute_request - > execute_reply
  • 此外,iopub套接字发送这些消息
    • 状态
    • pyout

如果你还在我身边,那么这一切都有效。 出现第一个IPython In[1]:提示符,我可以输入代码,将其发送到后端并从ipython接收execute_request消息。

但是,我的问题是在接收到execute_request的事件序列之后:

  • 向IPython发送了忙碌状态
  • 执行代码并捕获输出字符串
  • 向IPython发送了pyout消息
  • 将execute_reply发送到IPython
  • 将空闲状态发送到IPython

发送这些消息后,没有任何反应。我没有收到来自IPython的消息,代码执行也没有输出到控制台,也没有出现新的提示,要求用户提供更多的输入。

我只是想知道我是以正确的顺序发送邮件,还是发送了正确的邮件?

1 个答案:

答案 0 :(得分:0)

我已经在这个问题上工作了几个星期,而且我找不到控制台问题的解决方案。

但是,我找到了一种允许多个输入的解决方法。

首先我没有使用我之前使用的语言配置文件。这个语言配置文件只是告诉IPython使用什么内核以及使用什么加密字符串。

下一步,我开始使用笔记本而不是控制台。希望它能提供更多的投入。而且,确实如此。 :)

要使用指定的内核启动ipython,我使用了以下命令:

ipython2 notebook --KernelManager.kernel_cmd='["/usr/lib/erlang/bin/escript", "ipython_kernel.erl", "{connection_file}"]' --Session.key="" --Session.keyfile=""

在上面的命令中,我指定了内核命令,并提供以下内容:

  • 运行我的erlang内核的可执行文件的位置
  • 我的内核名称
  • 和连接文件

下一步,我将会话密钥和会话密钥文件指定为空字符串。

提供内核是正确编写的,它允许多个代码条目和markdown到ipyton / ierlang。

以下是ierlang早期阶段的样本:

The first IErlang Notebook

我希望这篇文章可以帮助那些努力为ipython开发内核的人。 :)


[更新 - 2014年4月12日]

我终于找到了问题所在。事实证明,当通过zmq发送erlang字符串(整数列表)时,它们会将IPython的消息解析器作为一个整数列表到达。

我认为,他们会自动转换为字符串,但他们没有。

<强>解决方案

解决方案是编辑IPython/kernel/zmq/session.py文件以允许它解析erlang字符串。

这允许输出提示出现在控制台和IErlang的笔记本版本中。