Использование библиотеки Java из Python - PullRequest
31 голосов
/ 25 января 2009

У меня есть приложение на Python и Java-приложение. Приложение python генерирует ввод для приложения java и вызывает его в командной строке.

Я уверен, что должно быть более элегантное решение для этого; так же, как использование JNI для вызова кода C из Java.

Есть указатели? (К вашему сведению, я не знаком с Python)

Разъяснение (ценой длинного вопроса: извинения) Приложение py (которое мне не принадлежит) принимает пользовательский ввод в виде ряда файлов конфигурации. Затем он обрабатывает эти и фермы работают с рядом (скрытых) инструментов через механизм плагинов. Я ищу, чтобы добавить поддержку функций, предоставляемых устаревшим приложением Java.

Так что нет смысла вызывать приложение python из приложения java, и я не могу запустить приложение py в среде jython (на JVM).

Поскольку очевидного механизма для этого нет, я думаю, что простой вызов CL является лучшим решением.

Ответы [ 6 ]

57 голосов
/ 25 сентября 2010

Извините, что воскрешен, но ответа не было ...

Вы также можете использовать Py4J . На первой странице есть пример и множество документации, но по сути вы просто вызываете методы Java из своего кода Python, как если бы они были методами Python:

>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway()                        # connect to the JVM
>>> java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
>>> other_object = java_object.doThat()
>>> other_object.doThis(1,'abc')
>>> gateway.jvm.java.lang.System.out.println('Hello World!') # call a static method

В отличие от Jython, Py4J работает на виртуальной машине Python, поэтому он всегда "в курсе" последней версии Python, и вы можете использовать библиотеки, которые плохо работают на Jython (например, lxml). Связь осуществляется через сокеты вместо JNI.

Отказ от ответственности: я являюсь автором Py4J

8 голосов
/ 25 января 2009

Взгляните на Jython . Это похоже на JNI, но замените C на Python, то есть вы можете вызывать Python из Java и наоборот. Не совсем понятно, что вы пытаетесь сделать или почему ваш нынешний подход не соответствует вашим ожиданиям.

5 голосов
/ 04 февраля 2009

Если вы действительно хотите встроить свое Java-приложение в процесс Python, взгляните на JPype . Он обеспечивает доступ к Java через JNI.

5 голосов
/ 25 января 2009

Оберните ваш Java-код в контейнер (сервлет / EJB).

Таким образом, вы не теряете время при запуске vm и переходите к сервис-ориентированности.

Для переноса вы можете использовать jython ( имеет смысл, только если вы знакомы с python )

Выберите коммуникационный протоколл, в котором могут использовать python и java:

  • json (см. Www.json.org)
  • rmi (Python: JPype)
  • REST
  • МЫЛО (только для смелых)

Выберите то, с чем вы или ваши партнеры знакомы!

4 голосов
/ 04 февраля 2009

Как насчет использования swig: http://www.swig.org/Doc1.3/Java.html?

2 голосов
/ 04 февраля 2009

Дайте JCC попробовать http://pypi.python.org/pypi/JCC/2.1

JCC - это генератор кода для вызова Java напрямую из CPython. Он поддерживает CPython 2.3+, несколько JRE (Sun JDK 1.4+, Apple JRE 1.4+ и OpenJDK 1.7) в OS X, Linux, Solaris и Windows. Он создан Open Source Application Foundation (OSAF, разработчиками Chandler) и выпускается под лицензией в стиле Apache.

Из описания пакета:

JCC - это генератор кода C ++ для создания связующего кода, необходимого для вызова классов Java из CPython через Java Native Invocation Interface (JNI).

JCC генерирует классы-оболочки C ++, которые скрывают все подробности доступа к JNI, а также управление памятью и ссылками на объекты Java.

JCC генерирует типы CPython, которые делают эти классы C ++ доступными из интерпретатора Python. JCC пытается сделать эти типы Python питоническими, обнаруживая итераторы и методы доступа к свойствам. Итераторы и отображения также могут быть объявлены в JCC.

...