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

Вызов Python в Java?

Мне интересно, можно ли вызывать функции python из java-кода с помощью jython или это только для вызова java-кода из python?

4b9b3361

Ответ 1

Вы можете легко вызвать функции python из Java-кода с помощью Jython. Это до тех пор, пока ваш код python сам работает под jython, т.е. Не использует некоторые c-расширения, которые не поддерживаются.

Если это сработает для вас, это, безусловно, самое простое решение, которое вы можете получить. В противном случае вы можете использовать org.python.util.PythonInterpreter из новой поддержки интерпретатора Java6.

Простой пример из верхней части моей головы - но я должен работать, надеюсь: (для краткости не выполняется проверка ошибок)

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sys\nsys.path.append('pathToModiles if they're not there by default')\nimport yourModule");
// execute a function that takes a string and returns a string
PyObject someFunc = interpreter.get("funcName");
PyObject result = someFunc.__call__(new PyString("Test!"));
String realResult = (String) result.__tojava__(String.class);

Ответ 2

Эй, я думал, что я введу свой ответ на это, хотя и опаздываю. Я думаю, что есть некоторые важные вещи, которые нужно сначала рассмотреть, насколько сильны вы хотите иметь связь между java и python.

Во-первых Вы хотите только вызывать функции или действительно хотите, чтобы код python менял данные в ваших Java-объектах? Это очень важно. Если вы хотите только вызвать код python с аргументами или без них, это не очень сложно. Если ваши аргументы являются примитивами, это делает его еще более простым. Однако, если вы хотите, чтобы функции-члены класса java реализовали в python, которые изменяют данные объекта java, это не так просто или прямо.

Во-вторых, говорим cpython или будем делать jython? Я бы сказал, что cpython - это где его! Я бы отстаивал это, поэтому питон - это такой кул! Имея такие высокие абстракции, но доступ к c, С++ при необходимости. Представьте, можете ли вы это сделать в java. Этот вопрос даже не стоит спрашивать, поддерживается ли jython, потому что в любом случае это легко.

Итак, я сыграл со следующими методами и перечислил их от простого к сложному:

Java для Jython

Преимущества: Тривиально легко. Имейте фактические ссылки на объекты Java

Недостатки: нет CPython, очень медленно!

Jython из java настолько прост, и если этого действительно достаточно, то отлично. Однако это очень медленно, и нет cpython! Жизнь стоит жить без cpython, я так не считаю! Вы можете легко иметь код python, реализующий ваши функции-члены для вас java-объектов.

Java для Jython для CPython через Pyro

Pyro - это модуль удаленного объекта для python. У вас есть некоторый объект на интерпретаторе cpython, и вы можете отправлять ему объекты, которые передаются через сериализацию, а также могут возвращать объекты с помощью этого метода. Обратите внимание: если вы отправляете сериализованный объект python из jython, а затем вызываете некоторые функции, которые изменяют данные в своих членах, вы не увидите этих изменений в java. Вам просто нужно помнить, чтобы отправить обратно данные, которые вы хотите от пиро. Это, я считаю, самый простой способ добраться до cpython! Вам не нужны никакие jni или jna или swig или... Вам не нужно знать ни c, ни С++. kool huh?

Преимущества: доступ к cpython, не так сложно, как следующие методы

Недостатки: невозможно изменить данные элемента java-объектов непосредственно из python. Является несколько косвенным (jython - средний человек).

Java на C/С++ через JNI/JNA/SWIG на Python через встроенный интерпретатор (возможно, используя библиотеки BOOST?)

OMG этот метод не для слабонервных. И я могу сказать, что мне потребовалось очень много времени, чтобы добиться этого с помощью приличного метода. Основная причина, по которой вы хотели бы сделать это, - это запустить код cpython, который будет полностью привязан к вашему java-объекту. Перед тем, как решить попробовать и хлеб java (который подобен шимпанзе) с питоном (который похож на лошадь), необходимо рассмотреть основные основные вещи. Во-первых, если вы нарушите интерпретатор, который отключит для вас программу! И не заводи меня на вопросы concurrency! Кроме того, есть выделение котла, я считаю, что нашел наилучшую конфигурацию, чтобы свести к минимуму этот котел, но все же он выделяется! Итак, как это сделать: Подумайте, что С++ - ваш средний человек, ваши объекты на самом деле являются объектами С++! Хорошо, что вы это знаете. Просто напишите свой объект так, как если бы ваша программа была как cpp, а не java, с данными, которые вы хотите получить из обоих миров. Затем вы можете использовать генератор обложек под названием swig (http://www.swig.org/Doc1.3/Java.html), чтобы сделать это доступным для java и скомпилировать dll, который вы называете System.load(имя dll здесь) в Ява. Сначала сделайте это, затем перейдите к сложной части! Чтобы перейти на python, вам нужно встроить интерпретатор. Во-первых, я предлагаю сделать некоторые программы-переводчики приветствия или этот учебник Встраивание python в C/C. Когда у вас будет эта работа, пришло время сделать лошадь и обезьяну танцевать! Вы можете отправить объект С++ на python с помощью [boost] [3]. Я знаю, что я не дал тебе рыбу, просто сказал тебе, где найти рыбу. Некоторые указатели для этого при компиляции.

При компиляции boost вам нужно будет скомпилировать общую библиотеку. И вам нужно включить и связать нужный материал с jdk, то есть jawt.lib, jvm.lib(вам также понадобится клиент jvm.dll в вашем пути при запуске приложения) Также как и python27.lib или что угодно и boost_python-vc100-mt-1_55.lib. Затем включите Python/include, jdk/include, boost и используйте только общие библиотеки (dll), в противном случае boost будет иметь слезу. И да, я знаю. Есть так много способов, чтобы это могло стать кислым. Поэтому убедитесь, что вы делаете все по блоку. Затем соедините их.

Ответ 3

Это зависит от того, что вы подразумеваете под функциями python? если они были написаны в cpython, вы не можете напрямую их вызвать, вам придется использовать JNI, но если они были написаны в Jython, вы можете легко вызвать их из java, так как jython в конечном итоге генерирует java-байтовый код.

Теперь, когда я говорю, написанное на cpython или jython, это не имеет особого смысла, потому что python - это python, и большинство кода будут работать на обеих реализациях, если вы не используете конкретные библиотеки, которые полагаются на cpython или java.

см. здесь как использовать интерпретатор Python в Java.

Ответ 4

Вы можете вызывать любой язык из java, используя Java Native Interface

Ответ 5

В зависимости от ваших требований могут быть полезны такие параметры, как XML-RPC, которые могут использоваться для удаленного вызова функций практически на любом языке, поддерживающем протокол.

Ответ 6

В нескольких ответах упоминается, что вы можете использовать JNI или JNA для доступа к cpython, но я бы не рекомендовал начинать с нуля, потому что уже есть библиотеки с открытым исходным кодом для доступа к cpython из java. Например:

Ответ 7

Jython имеет некоторые ограничения:

Существует несколько отличий. Во-первых, программы Jython не могут использовать CPython модули расширения, написанные на C. Эти модули обычно содержат файлы с расширение .so,.pyd или .dll. Если вы хотите использовать такой модуль, вы должны посмотреть для эквивалента, написанного на чистом Python или Java. Хотя это технически возможно поддерживать такие расширения - IronPython делает это - планов нет сделать это в Jython.

Распространение моих скриптов Python в виде файлов JAR с помощью Jython?

вы можете просто вызвать скрипты python (или bash или Perl-скрипты) из Java с помощью Runtime или ProcessBuilder и передать выход обратно на Java:

Запуск оболочки bash script в java

Запуск командной строки в Java

java runtime.getruntime() получение результата от выполнения командной строки

Ответ 8

Вот библиотека, которая позволяет вам писать свои сценарии python один раз и решать, какой метод интеграции (Jython, CPython/PyPy через Jep и Py4j) использовать во время выполнения:

https://github.com/subes/invesdwin-context-python

Поскольку каждый метод имеет свои преимущества/недостатки, как описано в ссылке.

Ответ 9

Не разумно иметь код python внутри java. Оберните свой код python флягой или другой веб-картой, чтобы сделать ее как микросервис. Сделайте вашу java-программу способной вызвать этот микросервис (например, через REST).

Верьте мне, это очень просто и сэкономит массу проблем. И коды слабо связаны, поэтому они масштабируемы.