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

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

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

8 Solutions collect form web for “Интеграция Java 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 .

  • Что такое скриптовый движок?
  • Java: форматирование строк с помощью заполнителей
  • Что такое хороший и бесплатный игровой движок?
  • Почему такие языки, как Java, различают строку и char, а другие нет?
  • Как получить выход из .jar-исполнения в кодах python?
  • Поиск функций трассировки файлов в Python, похожих на Java
  • «Add to set» возвращает логическое значение в java - как насчет python?
  • Java или Python для обработки естественного языка
  •  
    Interesting Posts for Van-Lav

    Отладка Jinja2 в Google App Engine

    Динамически импортировать метод в файл, из строки

    Запуск нескольких пауков с использованием scrapyd

    Pandas добавляет дополнительную строку в DataFrame при присвоении индекса

    Объект Vectorizer toArray (), массив слишком большой ошибки

    Корневой регистратор в dictconfig

    Переименование имени класса модели django и соответствующих внешних ключей с югом, без потери данных

    Разделение самопересекающегося многоугольника возвращает только один многоугольник в стиле в Python

    Отображение OpenCV-видео в tkinter с использованием многопроцессорности

    Создание json в python для механизма приложения

    Базовые индексирующие рекурсии подстроки в строке (python)

    Как захватить вывод интерпретатора Python и / или CMD.EXE из сценария Python?

    Как проверить, существует ли шаблон в Django?

    Является ли python достаточно умным, чтобы заменить вызовы функций постоянным результатом?

    Пользовательская Colormap в Python

    Python - лучший язык программирования в мире.