Интеграция Java Python
У меня есть приложение Java, которое необходимо интегрировать с сторонней библиотекой. Библиотека написана на Python, и я не говорю об этом. Я пытаюсь найти лучший способ интегрироваться с ним. Я пытаюсь использовать JEPP (Java Embedded Python) - кто-нибудь использовал это раньше? Моя другая мысль - использовать JNI для связи с связями C для Python.
Любые мысли о наилучшем способе сделать это будут оценены. Спасибо.
Ответы
Ответ 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?
Ответ 7
Я исследовал аналогичную установку с JNI. Может быть, это поможет, если вы еще этого не видели:
http://wiki.cacr.caltech.edu/danse/index.php/Communication_between_Java_and_Python
http://jpe.sourceforge.net/
Ответ 8
Если вы можете заставить свой код Python работать в Jython, тогда вы сможете использовать его для вызова из Java: