Использование java-библиотеки из python
У меня есть приложение python и приложение java. Приложение python создает вход для приложения java и вызывает его в командной строке.
Я уверен, что для этого должно быть более элегантное решение; так же, как использование JNI для вызова кода C из Java.
Любые указатели?
(FYI Я v. Новый для Python)
Уточнение (за счет длинного вопроса: извинения)
Приложение py (которое я не владею) принимает пользовательский ввод в виде нескольких файлов конфигурации. Затем он переписывает эти и фермы, работая с несколькими (скрытыми) инструментами через механизм плагина. Я хочу добавить поддержку функций, предоставляемых устаревшим Java-приложением.
Так что не имеет смысла вызывать приложение python из приложения java, и я не могу запустить приложение py в среде jython (на JVM).
Поскольку нет очевидного механизма для этого, я считаю, что простым вызовом CL является наилучшее решение.
Ответы
Ответ 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.
Ответ 5
Как насчет использования swig: http://www.swig.org/Doc1.3/Java.html?
Ответ 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.