Взаимодействие Интерпретаторов Python-Ironpython-Jython

Возникла необходимость решить следующую проблему: как обмениваться данными между разными интерпретаторами Python?! Я нашел несколько решений, но хочу рассказать об одном, на мой взгляд, самом удобном.



Выбор подхода

Для начала я постарался выбрать самое удобное решение из множества.

Возможно не корректно сравнивать очередь сообщений, сокеты и RPC, но я исходил из задачи.

Вот что доступно:

TCP-сокеты
Использование сокетов — самый простой способ взаимодействия; передавать можно любые данные, но код придется наполнять реализацией собственного протокола.

Этот путь тернист, и ошибки неизбежны.

Вывод: подходит, но сложно.



Библиотека ZeroMQ
Очень многообещающая разработка очереди сообщений без брокера.

Реализовано как библиотека pyzmq И pyzmq-статический .

В первом случае вам необходимо установить сам ZeroMQ — общую библиотеку, написанную на C. Второй уже содержит бинарный файл.

Все начиналось довольно забавно, код работал нормально, пока я не перешел на IronPython. Для IronPython pyzmq не реализован, но это не проблема, есть интеграция .

NET, которая позволяет использовать clrzmq — привязка для .

NET; и тут начались проблемы.

Бинарник доступен через плагин для VisualStudio — nuget, поэтому мне пришлось скомпилировать библиотеку.

Скачал исходники, там все удобно, скрипт собирается командой build, но не все так просто.

Версия 2 вообще не собиралась, хотя зависимости разрешались корректно через nuget (может я взял битый коммит?), бета 3 собиралась, но крашилась даже на примере из туториала) В итоге я нашел в сети бинарник 2, но он меня совершенно не порадовал.

Все работало, но API в 3 поменялось настолько, что переписывать код по сто раз не хотелось.

Вывод: хорошо, но сыровато за пределами чистого Python.

Поджигатель, подожги его!
Сначала решил добить 0mq, но вспомнил о существовании такой библиотеки как Поджигатель : библиотека из кризисных 90-х, которая хорошо себя чувствует и развивается.

Я не буду перечислять все его преимущества; сейчас меня интересует только одно – взаимодействие переводчиков.

Давайте перейдем непосредственно к делу, давайте попробуем пример из руководство , но с той разницей, что запускаем всё под разными интерпретаторами (код не менял, просто ввёл свой никнейм).

Запускаем нейм-сервер под Jython, кстати, это первый огромный плюс, у 0mq нейм-сервер еще не доделан:

Взаимодействие интерпретаторов Python-IronPython-Jython

Ух ты! Началось.

Теперь регистрируем сервер, на котором будет работать IronPython:

Взаимодействие интерпретаторов Python-IronPython-Jython

Регистрация прошла успешно.

Следующий шаг — запуск клиента.

Делаем это с помощью классического Python (их у меня сразу много, но я запускал EPD):

Взаимодействие интерпретаторов Python-IronPython-Jython

Замечательный! Все работало.



маринованная версия
Как вариант, я также попробовал запустить одну из частей под Python 3. Без хака не получилось :( Последний использует Pickle версии 3 + отсутствуют (удалены, перемещены) некоторые стандартные модули, хотя такое поведение может быть Но основная причина в том, что Pyro4 использует для сериализации Pickle, причем последнюю версию.

Вот как нам удалось обойти этот недостаток и подключить Python 3 к IronPython 2 и Jython 2:

   

import pickle pickle.HIGHEST_PROTOCOL = 2

Это необходимо добавить в клиентский код перед импортом Pyro. Все работало:

Взаимодействие интерпретаторов Python-IronPython-Jython

Обратите внимание на использование 64-битного Python 3 вместе с двойками.

Кстати, как вариант, можно воспользоваться библиотекой пиролит для прямого подключения из .

NET или Java без интерпретатора Python. На самом деле это мини-огурчик.

В целом решение с Pyro мне пока понравилось больше других, но если система содержит много компонентов разных версий, то, наверное, выгоднее будет использовать 0mq. Хотя я пока остановлюсь на Pyro4. Теги: #python #IronPython #jython #межпроцессное взаимодействие #.

NET #java #python

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.