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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Мой 0.02 $ 🙂

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

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

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

    http://jpe.sourceforge.net/

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

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

    Много лет спустя, просто добавить вариант, который является более популярным в эти дни …

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