Подтвердить что ты не робот

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

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

Любые мысли о наилучшем способе сделать это будут оценены. Спасибо.

4b9b3361

Ответ 1

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

EDIT: если теперь вы можете использовать Jython, но подумайте, что у вас могут быть проблемы с более поздней версией библиотеки, я предлагаю вам попробовать изолировать библиотеку от вашего приложения (например, какой-то интерфейс адаптера). Пойдите с самой простой вещью, которая работает на данный момент, затем рассмотрите JNI/CPython/etc, если и когда вам когда-нибудь понадобится. Там мало что можно получить, пройдя (болезненный) маршрут JNI, если вам действительно не нужно.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Мой 0.02 $:)

Ответ 5

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

Ответ 6

Рассматривали ли вы запуск Jython на виртуальной машине Java?