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

Использование java-библиотеки из python

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

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

Любые указатели? (FYI Я v. Новый для Python)

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

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

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

4b9b3361

Ответ 1

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

Вы также можете использовать 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 VM, поэтому он всегда "обновляется" с последней версией Python, и вы можете использовать библиотеки, которые не работают на Jython (например, lxml). Связь выполняется через сокеты вместо JNI.

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

Ответ 2

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

Ответ 3

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

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

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

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

  • json (см. www.json.org)
  • rmi (Python: JPype)
  • REST
  • SOAP (только для храбрых)

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

Ответ 4

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

Ответ 6

Дайте 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. Он подготовлен Фондом приложений с открытым исходным кодом (OSAF, люди, производящие Chandler) и выпущен под лицензией Apache.

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

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

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

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