Я довольно новичок в python и пытаюсь вызвать функцию python из java.Различные/лучшие подходы для вызова функции python из Java
Мои основные требования таковы:
- вызов должен быть прозрачным, в том смысле, что она не требует изменения
.py
файла просто, чтобы он мог быть вызван из Java. Мне может быть предоставлен любой файл python с некоторыми функциями внутри него. Я должен иметь возможность вызывать любую из этих функций, не требуя изменения файла.py
. - Я хочу, чтобы иметь возможность посылать аргументы обеих примитивных типов (
int
,String
,floats
и т.д.) или не являющихся примитивных типов (HashMap
,ArrayList
) от Java для функции питона и получить обратно возвращенный объект (который может примитивных типов или не-примитивные типы) от python до java. - I предпочтительно хочу придерживаться CPython вместо Jython
Есть несколько вариантов, которые я нашел в Интернете. Мало:
Использование Jython-х PythonInterpreter, с которым я могу вызвать функцию питона, не требуя каких-либо изменений в файл сценария
.py
:py1.py
def square2(list): squares = [] for i in list: squares.append(i*i) return squares
JythonTest.groovy
import org.python.util.PythonInterpreter import org.python.core.*; class JythonTest { static main(def args) { PythonInterpreter pi = new PythonInterpreter() pi.exec("from py1 import square2") PyFunction pf = (PyFunction)pi.get("square2") println pf.__call__(new PyList([1,2,3,4]))[2] //9 } }
Я очень хорошо могу удовлетворить свои потребности. Но это не CPython.
Использование ScriptEngine: Это очень похоже на PythonInterpreter. Но снова его Jython. Кроме того, в отличие от PythonInterpreter, мы не можем работать с Jython 2.5+ и не можем напрямую обращаться к PyObjects. Таким образом, этот вариант может быть очень хорошо закрыт.
- Использование py4j: Cant найти пример, который является минимально в случае Jython PythonInterpreter
- Использование java2python. Но not much information is given о вызове python из java, чтобы я мог заключить, могут ли быть удовлетворены мои вышеуказанные требования. Может ли кто-нибудь пролить свет на это? Более конкретно, если мы сможем записать код как минимальный, как в Jython PythonInterpreter.
- Использование JPype: Однако после быстрого прохождения я чувствую, что не буду писать минимальный код, как в случае с Jython PythonInterpreter. Также я почувствовал, что проект несколько не развивается. Это?
Кажется, что Jython PythonInterpreter - лучший выбор, если я правильно понял все вышеприведенные подходы. Я сделал ошибки, хватая их? Также есть ли другой лучший вариант?
Не совсем связано, но есть ли какая-то особая причина, по которой вы предпочитаете использовать CPython над Jython? Марширование типов данных между Java и CPython будет сложнее, и с Jython, построенным поверх JVM-взаимодействия, должно быть проще. – UnholySheep
, потому что я чувствую, что Jython будет немного медленнее, чем CPython, также может быть, потому что мне, возможно, придется ждать появления новых библиотек в CPython, но все же прийти в Jython – Mahesha999
У меня никогда не было проблем с производительностью Jython в моих случаях использования (может, конечно, быть другим в вашем). Доступность библиотеки, конечно, потенциальная проблема, однако, если вы точно не знаете, что вам нужно использовать библиотеку, недоступную для Jython, я думаю, что проще использовать ее вместо CPython. (Это то, что я обычно делал, так как я не знал о каких-либо библиотеках клея, которые бы позволили вам использовать такой способ взаимодействия) – UnholySheep