Интеграция Java Python - PullRequest
       13

Интеграция Java Python

48 голосов
/ 13 июля 2009

У меня есть приложение на Java, которое необходимо интегрировать со сторонней библиотекой. Библиотека написана на Python, и я ничего не могу сказать по этому поводу. Я пытаюсь найти лучший способ интеграции с ним. Я пробую JEPP (Java Embedded Python) - кто-нибудь использовал это раньше? Другая моя мысль - использовать JNI для связи с привязками C для Python.

Буду признателен за любые мысли о том, как это сделать. Спасибо.

Ответы [ 8 ]

35 голосов
/ 13 июля 2009

Почему бы не использовать Jython ?Единственный недостаток, о котором я могу сразу подумать, - это если ваша библиотека использует собственные расширения CPython.

РЕДАКТИРОВАТЬ: если вы можете использовать Jython now , но думаю, что у вас могут быть проблемы с более поздней версией библиотекиЯ предлагаю вам попытаться изолировать библиотеку от вашего приложения (например, какой-нибудь интерфейс адаптера).Пойдите с самой простой вещью, которая работает на данный момент, затем рассмотрите JNI / CPython / etc, если и когда вам когда-либо понадобится.Пройдя (болезненный) маршрут JNI, вы вряд ли сможете получить что-то еще, если вам действительно не нужно.

18 голосов
/ 13 июля 2009

Честно говоря большинство способов каким-либо образом запустить Python непосредственно из JVM не работают . Они либо не совсем совместимы (в новом выпуске вашей сторонней библиотеки могут использоваться функции Python 2.6 и не будут работать с Jython 2.5), либо будут хакерскими (это может нарушиться при использовании загадочной трассировки стека JVM, которая не приведет к решению).

Мой предпочтительный способ объединить два - использовать RPC . XML RPC не является плохим выбором, если у вас есть умеренное количество данных. Это довольно хорошо поддерживается & mdash; Python имеет его в своей стандартной библиотеке. Библиотеки Java также легко найти. Теперь, в зависимости от ваших настроек, либо Java, либо Python будет сервером, принимающим соединение с другого языка.

Менее популярным, но заслуживающим рассмотрения альтернативным способом создания RPC являются протобуферы Google, которые имеют 2/3 поддержки nice rpc . Вам просто нужно предоставить свой транспортный уровень. Не так много работы и удобство написания разумно.

Другой вариант - написать обертку C вокруг тех фрагментов функциональности Python, которые вам нужно представить в Java, и использовать ее через собственные плагины JVM. Вы можете облегчить боль, перейдя с SWIG SWIG .

По сути, в вашем случае это работает так:

  1. Создание интерфейса SWIG для всех вызовов методов из Java в C ++.
  2. Создайте код C / C ++, который будет принимать ваши вызовы, и внутренне вызывать интерпретатор python с правильными параметрами.
  3. Преобразуйте ответ, полученный от python, и отправьте его через swig обратно в код Java.

Это решение довольно сложное, в большинстве случаев немного излишнее. Тем не менее, это стоит делать, если вы (по некоторым причинам) не можете позволить себе RPC. RPC по-прежнему будет моим предпочтительным выбором.

11 голосов
/ 18 марта 2017

Много лет спустя, просто чтобы добавить опцию, которая более популярна в наши дни ...

Если вам нужна функциональность CPython, py4j - хороший вариант. py4j видел частые обновления в 2016 2017 2018 и приобрел некоторую популярность, поскольку он используется, например Apache Spark для достижения совместимости с CPython .

7 голосов
/ 13 июля 2009

Моя другая мысль - использовать JNI для связи с привязками C для Python.

Мне очень нравится JNA :

JNA обеспечивает программам Java легкий доступ к собственным разделяемым библиотекам (DLL в Windows) без написания чего-либо, кроме кода Java - никакой JNI или собственный код не требуется. Эта функциональность сравнима с ctypes для Windows Platform / Invoke и Python. Доступ динамический во время выполнения без генерации кода.

Мой 0,02 $:)

5 голосов
/ 13 июля 2009

Вы можете использовать службу обмена сообщениями, например ActiveMQ . Он имеет как Python , так и поддержку Java. Таким образом, вы можете оставить сложные привязки JNI или C такими, какие они есть, и заниматься исключительно тем, что я считаю простым интерфейсом. Более того, когда библиотека обновляется, вам не нужно сильно что-либо менять.

4 голосов
/ 13 июля 2009

Я исследовал подобную установку с JNI. Может быть, это поможет, если еще не видел:

http://wiki.cacr.caltech.edu/danse/index.php/Communication_between_Java_and_Python

http://jpe.sourceforge.net/

4 голосов
/ 13 июля 2009

Рассматривали ли вы запуск Jython на Java VM?

3 голосов
/ 13 июля 2009

Если вы можете заставить свой код Python работать в Jython, то вы должны использовать его для вызова его из Java:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...