Как лучше всего вызвать 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 - мертвый проект?
Есть ли другие альтернативы?
С уважением, Дэвид
Ответы:
Вот мое краткое изложение этой проблемы: 5 способов вызова Java из Python
http://baojie.org/blog/2014/06/16/call-java-from-python/ ( кешировано )
Краткий ответ: Jpype работает довольно хорошо и доказал свою эффективность во многих проектах (например, python-котелпайп), но Pyjnius быстрее и проще, чем JPype.
Я пробовал Pyjnius / Jnius, JCC, javabridge, Jpype и Py4j.
Py4j немного сложен в использовании, так как вам нужно запустить шлюз, добавив еще один уровень хрупкости.
источник
Вы также можете использовать Py4J . На главной странице есть пример и много документации, но, по сути, вы просто вызываете методы Java из своего кода Python, как если бы они были методами Python:
В отличие от Jython, одна часть Py4J работает в виртуальной машине Python, поэтому она всегда «обновлена» до последней версии Python, и вы можете использовать библиотеки, которые плохо работают на Jython (например, lxml). Другая часть работает в виртуальной машине Java, которую вы хотите вызвать.
Связь осуществляется через сокеты вместо JNI, а Py4J имеет собственный протокол (для оптимизации определенных случаев, для управления памятью и т. Д.)
Отказ от ответственности: я являюсь автором Py4J
источник
s = gateway.jvm.ch.ethz.ssh2.crypto.Base64() bt_out = s.decode();
здесь класс Base64 имеет методы encode () и decode () и является частью пакетаch.ethz.ssh2.crypto
в моем файле .jar. Я получаюfrom py4j.reflection import MethodInvoker ImportError: No module named reflection
Pyjnius.
Документы: http://pyjnius.readthedocs.org/en/latest/
Github: https://github.com/kivy/pyjnius
Со страницы github:
источник
Я использую OSX 10.10.2, и мне удалось использовать JPype.
Возникли проблемы с установкой с Jnius (у других тоже ), Javabridge установлен, но выдает загадочные ошибки, когда я пытался его использовать, PyJ4 имеет это неудобство, связанное с необходимостью сначала запускать сервер шлюза на Java, JCC не устанавливается. Наконец, JPype заработал. На Github есть поддерживаемый форк JPype . У него есть основные преимущества: (а) он устанавливается правильно и (б) он может очень эффективно преобразовывать массивы Java в массив numpy (
np_arr = java_arr[:]
)Процесс установки был:
И ты должен уметь
import jpype
Следующая демонстрация работала:
Когда я попытался вызвать свой собственный java-код, мне пришлось сначала выполнить compile (
javac ./blah/HelloWorldJPype.java
), и мне пришлось изменить путь JVM по умолчанию (иначе вы получите необъяснимые ошибки «класс не найден»). Для меня это означало изменение команды startJVM на:источник
Если вы используете Python 3, есть форк JPype под названием JPype1-py3.
У меня это работает на OSX / Python 3.4.3. (Вам может понадобиться
export JAVA_HOME=/Library/Java/JavaVirtualMachines/your-java-version
)источник
В последнее время я много чего интегрирую в Python, включая Java. Самый надежный метод, который я нашел, - это использование IKVM и оболочки C #.
У IKVM есть изящное маленькое приложение, которое позволяет вам взять любой Java JAR и преобразовать его прямо в .Net DLL. Он просто переводит байт-код JVM в байт-код CLR. Подробнее см. Http://sourceforge.net/p/ikvm/wiki/Ikvmc/ .
Преобразованная библиотека ведет себя так же, как собственная библиотека C #, и вы можете использовать ее без использования JVM. Затем вы можете создать проект оболочки C # DLL и добавить ссылку на преобразованную DLL.
Теперь вы можете создать несколько заглушек оболочки, которые вызывают методы, которые вы хотите предоставить, и пометить эти методы как DllEport. Подробнее см. Https://stackoverflow.com/a/29854281/1977538 .
DLL-оболочка действует так же, как собственная библиотека C, а экспортированные методы выглядят так же, как экспортированные методы C. Вы можете подключиться к ним как обычно, используя ctype.
Я пробовал это с Python 2.7, но он должен работать и с 3.0. Работает в Windows и Linux
Если вы используете C #, то это, вероятно, лучший подход, который можно попробовать при интеграции почти чего-либо в python.
источник
Я только начинаю использовать JPype 0.5.4.2 (июль 2011 г.), и похоже, что он работает нормально ...
Я использую Xubuntu 10.04
источник
Я предполагаю, что если вы можете перейти с C ++ на Java, то все готово. Я видел, как продукт того типа, о котором вы говорите, работает хорошо. Так получилось, что мы использовали CodeMesh . Я не одобряю конкретно этого поставщика и не делаю никаких заявлений об относительном качестве его продукта, но я видел, как он работает в сценарии довольно большого объема.
В целом я бы сказал, что по возможности я бы порекомендовал воздержаться от прямой интеграции через JNI, если это возможно. Некоторые простые подходы к службам REST или архитектуру на основе очередей будут проще в разработке и диагностике. Вы можете получить вполне приличную производительность, если будете осторожно использовать такие изолированные технологии.
источник
Благодаря моему собственному опыту, пытаясь запустить некоторый java-код изнутри python ia способом, похожим на то, как python-код работает внутри java-кода в python, мне не удалось найти прямую методологию.
Мое решение моей проблемы заключалось в запуске этого java-кода в виде сценариев beanshell путем вызова интерпретатора beanshell в качестве команды оболочки из моего кода python после редактирования кода java во временном файле с соответствующими пакетами и переменными.
Если то, о чем я говорю, полезно в какой-то мере, я рад помочь вам поделиться более подробной информацией о моих решениях.
источник