Вызов Java из Python [закрыт]



Как лучше всего вызвать java из python?
(jython и RPC не вариант для меня).



Я слышал о JCC:http://pypi.python.org/pypi/JCC/1.9
генератор кода C++ для вызова Java из C++ / Python
Но это требует компиляции всех возможных вызовов; я бы предпочел другое решение.



Я слышал о JPype:http://jpype.sourceforge.net/
руководство: http://www.slideshare.net/onyame/mixing-python-and-java



import jpype 
jpype.startJVM(path to jvm.dll, "-ea")
javaPackage = jpype.JPackage("JavaPackageName")
javaClass = javaPackage.JavaClassName
javaObject = javaClass()
javaObject.JavaMethodName()
jpype.shutdownJVM()


Это похоже на то, что мне нужно.
Тем не менее, последний релиз с января 2009 года, и я вижу, что люди не могут скомпилировать JPype.



является ли JPype мертвым проектом?



есть ли другие альтернативы?



С уважением,
Дэвид

426   9  

9 ответов:

вот мое резюме этой проблемы: 5 способов вызова Java из Python

http://baojie.org/blog/2014/06/16/call-java-from-python/ ( cached)

короткий ответ: Jpype работает довольно хорошо и доказано во многих проектах (таких как python-boilerpipe), но Pyjnius быстрее и проще, чем JPype

Я пробовал Pyjnius/Jnius, JCC, javabridge, Jpype и Py4j.

Py4j немного трудно использовать, так как вам нужно начать шлюз, добавляющий еще один слой хрупкости.

вы также можете использовать 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). Другая часть работает в виртуальной машине Java, которую вы хотите вызвать.

связь осуществляется через сокеты вместо JNI, а Py4J имеет свой собственный протокол (для оптимизации некоторых случаев, для управления памятью и т. д.)

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

Pyjnius.

Docs:http://pyjnius.readthedocs.org/en/latest/

Github:https://github.com/kivy/pyjnius

со страницы github:

модуль Python для доступа к классам Java в качестве классов Python с использованием JNI.

PyJNIus - это "незавершенное производство".

краткий обзор

>>> from jnius import autoclass
>>> autoclass('java.lang.System').out.println('Hello world') Hello world

>>> Stack = autoclass('java.util.Stack')
>>> stack = Stack()
>>> stack.push('hello')
>>> stack.push('world')
>>> print stack.pop() world
>>> print stack.pop() hello

Я на OSX 10.10.2, и мне удалось использовать JPype.

столкнулись с проблемами установки с Jnius (другие тоже), Javabridge установлен, но дал таинственные ошибки, когда я пытался его использовать, PyJ4 имеет это неудобство того, чтобы сначала запустить сервер шлюза в Java, JCC не будет устанавливать. Наконец, JPype закончил работу. Там есть поддерживается вилка JPype на Github. Он имеет основные преимущества, которые (а) он устанавливает правильно и (Б) это может очень эффективно конвертировать массивы java в массив numpy (np_arr = java_arr[:])

процесс установки был такой:

git clone https://github.com/originell/jpype.git
cd jpype
python setup.py install

и вы должны быть в состоянии import jpype

следующая демонстрация работала:

import jpype as jp
jp.startJVM(jp.getDefaultJVMPath(), "-ea")
jp.java.lang.System.out.println("hello world")
jp.shutdownJVM() 

когда я попытался вызвать свой собственный код java, мне пришлось сначала скомпилировать (javac ./blah/HelloWorldJPype.java), и мне пришлось изменить путь JVM по умолчанию (в противном случае вы получите необъяснимые ошибки "класс не найден"). Для меня это означало изменение команды startJVM к:

jp.startJVM('/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/MacOS/libjli.dylib', "-ea")
c = jp.JClass('blah.HelloWorldJPype')  
# Where my java class file is in ./blah/HelloWorldJPype.class
...

в последнее время я интегрировал много вещей в Python, включая Java. Самый надежный метод, который я нашел, - это использовать IKVM и оболочку C#.

IKVM имеет аккуратное небольшое приложение, которое позволяет вам взять любой java JAR и конвертировать его непосредственно в DLL .Net. Он просто переводит байт-код JVM в байт-код CLR. См.http://sourceforge.net/p/ikvm/wiki/Ikvmc/ Подробнее.

преобразованная библиотека ведет себя так же, как и собственная библиотека C#, и вы можно использовать его без необходимости JVM. Затем можно создать проект-оболочку библиотеки DLL C# и добавить ссылку на преобразованную библиотеку DLL.

теперь вы можете создать некоторые заглушки оболочки, которые вызывают методы, которые вы хотите предоставить, и пометить эти методы как DllEport. См.https://stackoverflow.com/a/29854281/1977538 для деталей.

DLL-оболочка действует так же, как и собственная библиотека C, с экспортированными методами, похожими на экспортированные методы C. Вы можете подключиться к ним используя ctype как обычно.

Я пробовал его с Python 2.7, но он должен работать и с 3.0. Работает на Windows и Linuxes

Если вы используете C#, то это, вероятно, лучший подход, чтобы попробовать при интеграции почти ничего в python.

Я только начинаю использовать JPype 0.5.4.2 (июль 2011), и похоже, что он работает хорошо...
Я на Xubuntu 10.04

Если вы находитесь в Python 3, есть вилка JPype называется JPype1-py3

pip install JPype1-py3

это работает для меня на OSX / Python 3.4.3. (Возможно, вам придется export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version)

from jpype import *
startJVM(getDefaultJVMPath(), "-ea")
java.lang.System.out.println("hello world")
shutdownJVM()

Я предполагаю, что если вы можете получить от C++ до Java, то вы все настроены. Я видел продукт, о котором вы упомянули, хорошо работает. Как это бывает, тот, который мы использовали был CodeMesh. Я не особо одобряю этого поставщика или делаю какое-либо заявление об относительном качестве их продукта, но я видел, что он работает в довольно большом объеме.

Я бы вообще сказал, что если это вообще возможно, я бы рекомендовал держаться подальше от прямой интеграции через JNI, если вы мочь. Некоторые простые подходы к службе REST или архитектура на основе очередей, как правило, проще разрабатывать и диагностировать. Вы можете получить вполне приличную производительность, если будете тщательно использовать такие развязанные технологии.

благодаря моему собственному опыту, пытаясь запустить некоторый код java из python i способом, подобным тому, как код python работает в Java-коде в python, я не смог найти прямую методологию.

мое решение моей проблемы состояло в том, чтобы запустить этот код java как сценарии beanshell, вызвав интерпретатор beanshell как оболочку commnad из моего кода python после редактирования кода java во временном файле с соответствующими пакетами и переменная.

Если то, о чем я говорю, полезно в любом случае, я рад помочь вам поделиться более подробной информацией о моих решениях.

Comments

    Ничего не найдено.