Реализация ядра языка IPython в Erlang

В настоящее время я создаю серверную часть ядра языка Erlang для IPython и тестирую ее в консоли.

Что у меня работает:

  • Запустите консоль ipython и ядро ​​erlang.
  • Ядро Erlang читает содержимое файла kernel.json, который содержит все номера портов для zmq.
  • Создайте привязки zmq для сокетов shell, heartbeat, control, iopub с помощью библиотеки erlzmq2.
  • Созданы функции для разбора сообщений от IPython.
  • Создайте процесс для сервера Heartbeat, на котором он будет работать, и возвращать сообщения в IPython.
  • Created a process for the Shell Socket to receive and respond to the following messages
    • kernel_info_request -> kernel_info_reply
    • выполнить_запрос -> выполнить_ответ
  • Also, the iopub socket sends these messages
    • status
    • пиаут

Если ты все еще со мной, все это работает. Появляется первое приглашение IPython In[1]:, и я могу ввести код, отправить его на сервер и получить сообщение execute_request от ipython.

Однако моя проблема заключается в том, что после этой последовательности событий я получаю execute_request:

  • отправил статус занятости в IPython
  • выполнил код и захватил выходную строку
  • отправил сообщение pyout в IPython
  • отправил execute_reply в IPython
  • отправил статус ожидания в IPython

После отправки этих сообщений ничего не происходит. Я больше не получаю сообщений от IPython, и выполнение кода не выводится на консоль, а также не появляется новое приглашение с запросом дополнительных данных от пользователя.

Мне просто интересно, отправляю ли я сообщения в правильном порядке или я отправляю правильные сообщения?


person Robbie    schedule 01.04.2014    source источник
comment
Во-первых: это круто! Код уже доступен где-то? Во-вторых: какую версию IPython вы используете?   -  person filmor    schedule 01.04.2014
comment
Привет, код еще недоступен :( . Он будет доступен в ближайшее время (как только я очистю его от рефакторинга некоторого кода) ... может быть, на следующей неделе :) . Я использую IPython 2.0.0-dev с протоколом обмена сообщениями версии 4.1.   -  person Robbie    schedule 01.04.2014
comment
Если вам интересно, IErlang теперь доступен по адресу github.com/robbielynch/ierlang.   -  person Robbie    schedule 19.04.2014


Ответы (1)


Я работаю над этим уже пару недель и не нашел решения проблемы с консолью.

Тем не менее, я нашел обходной путь, который допускает более одного ввода.

Во-первых, я не использовал языковой профиль, который использовал ранее. Этот языковой профиль просто сообщает IPython, какое ядро ​​использовать и какую строку шифрования использовать.

Затем я начал использовать ноутбук вместо консоли. В надежде, что это предложит больше входных данных. И это произошло. :)

Чтобы запустить ipython с указанным ядром, я использовал следующую команду:

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

В приведенной выше команде я указываю команду ядра и предоставляю следующее:

  • расположение исполняемого файла для запуска моего ядра erlang
  • имя моего ядра
  • и файл подключения

Далее я указываю ключ сеанса и файл ключей сеанса в виде пустых строк.

При условии, что ядро ​​написано правильно, оно допускает множественный ввод кода и уценку в ipyton/ierlang.

Вот пример ierlang на ранних стадиях:

Первая записная книжка IErlang

Я надеюсь, что этот пост поможет всем, кто пытается разработать ядра для ipython. :)


[Обновление — 12 апреля 2014 г.]

Я наконец понял проблему. Оказывается, при отправке строк erlang (список целых чисел) через zmq они поступают в парсер сообщений IPython в виде списка целых чисел.

Я предположил, что они автоматически преобразуются в строки, но это не так.

Решение

Решение состояло в том, чтобы отредактировать файл IPython/kernel/zmq/session.py, чтобы он мог анализировать строки erlang.

Это позволило вывести приглашение на вывод в консоли и в версиях IErlang для ноутбуков.

person Robbie    schedule 10.04.2014