Как запустить Java из Python [duplicate]

У меня был тот же вопрос, но потом у меня был момент «духа». Вместо записи

x ~ y

напишите

y ~ x

Очевидно, что это соответствует «x» вместо «y», но отвечает «есть ли совпадение?». вопрос и простой обход DOM могут привести вас к правильному элементу более эффективно, чем цикл в javascript.

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

93
задан David Portabella 6 September 2010 в 16:19
поделиться

9 ответов

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

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

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

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

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

30
ответ дан Benjamin B. 19 August 2018 в 12:26
поделиться

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

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

Отказ: я автор Py4J

113
ответ дан Aubin 19 August 2018 в 12:26
поделиться
  • 1
    Спасибо за ссылку. это похоже на альтернативу с открытым исходным кодом, которую предложил djna, CodeMesh. Я окончательно посмотрю на это. Однако существует такая же проблема, как и в CodeMesh, для этого требуется запустить Java-процесс и убедиться, что он работает до использования python (см. Пример на главной веб-странице проекта, ListPrinter.java - & gt; main - & gt; GatewayServer. Начало()). Это возможная ошибка. Я все еще думаю, что подход JPype превосходный; только это кажется мертвым проектом. – David Portabella 25 September 2010 в 13:33
  • 2
    работает ли решение по-прежнему? – alvas 14 April 2014 в 16:28
  • 3
    @alvas Я все еще поддерживаю Py4J, если это то, что вы имели в виду. – Barthelemy 15 April 2014 в 00:49
  • 4
    @Barthelemy, как пойти на интеграцию, если код Java зависит от библиотеки - opencv в моем случае? – user 2 April 2016 в 10:47
  • 5
    @stack просто не забудьте добавить opencv в свой путь к классам, и вы сможете получить к нему доступ с Python при запуске GatewayServer. – Barthelemy 3 April 2016 в 01:14

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

IKVM имеет небольшое приложение, которое позволяет вам использовать любой Java JAR и преобразовывать его непосредственно в DLL .Net. Он просто переводит байт-код 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 и Linuxes

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

3
ответ дан Community 19 August 2018 в 12:26
поделиться

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

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

1
ответ дан djna 19 August 2018 в 12:26
поделиться
  • 1
    – David Portabella 6 September 2010 в 17:06
  • 2
    Для этого потребуется запустить Java-процесс раньше и убедиться, что он работает до использования python. Это возможная ошибка. Подход JPype превосходный; только это кажется мертвым проектом. – David Portabella 6 September 2010 в 17:07
  • 3
    Я даю общие советы. JNI - потенциальное минное поле. – djna 7 September 2010 в 07:13

Pyjnius.

Документы: 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
12
ответ дан gdw2 19 August 2018 в 12:26
поделиться

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

2
ответ дан Joril 19 August 2018 в 12:26
поделиться
2
ответ дан k107 19 August 2018 в 12:26
поделиться

Я на OSX 10.10.2 и преуспел в использовании JPype.

Устранены проблемы установки с Jnius ( другие тоже ), Javabridge установлен, но дал таинственные ошибки когда я попытался использовать его, PyJ4 испытывает такое неудобство при запуске сервера шлюза в Java сначала, JCC не будет устанавливать. Наконец, JPype закончил работу. В Github есть поддерживаемая форма JPype . Он имеет следующие основные преимущества: (a) он правильно устанавливается и (b) он может очень эффективно преобразовывать массивы 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 по умолчанию (в противном случае вы получите необъяснимые ошибки «class not found»). Для меня это означало изменение команды 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
...
3
ответ дан Peter 19 August 2018 в 12:26
поделиться

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

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

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

0
ответ дан shady alaa 19 August 2018 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: