Различные / лучшие подходы для вызова функции Python из Java
Я новичок в Python и пытаюсь вызвать функцию Python из Java.
Мои основные требования следующие:
вызов должен быть прозрачным, в том смысле, что он не должен требовать изменения.py
файл просто, чтобы позволить ему быть вызванным из Java. Я мог бы дать любой файл Python с некоторыми функциями внутри него. Я должен иметь возможность вызывать любую из этих функций без необходимости изменения.py
файл.Я хочу иметь возможность отправлять аргументы обоих примитивных типов (int
, String
, floats
и т. д.) или не примитивные типы (HashMap
,ArrayList
) из Java в функцию Python и получить обратно возвращенный объект (который может быть примитивных типов или не примитивных типов) из Python в Java. Я также использую pandas DataFrame и numpy ndarray и, следовательно, также хочу иметь возможность отправлять и получать соответствующие объекты в и из Java.I предпочтительно Я хочу придерживаться CPython вместо Jython, потому что мне может понадобиться использовать более новые библиотеки, которые могут быть недоступны в Jython.Есть несколько вариантов, которые я нашел в Интернете. Мало кто из них:
Используйте JythonPythonInterpreter с помощью которого я могу вызвать функцию Python без каких-либо изменений в.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: Не могу найти пример, который так же минимален, как в случае с Jython PythonInterpreterиспользованиеjava2python, Ноне так много информации о вызове python из java, чтобы я мог сделать вывод, могут ли мои вышеуказанные требования быть выполнены. Кто-нибудь может пролить больше света на это? Точнее, если мы сможем написать такой же минимальный код, как в Jython PythonInterpreter.использованиеJPype: Однако после быстрого прохождения я чувствую, что не смогу написать столь же минимальный код, как в случае с Jython PythonInterpreter. Также я почувствовал, что проект несколько не в разработке. Это?Кажется, что Jython PythonInterpreter - лучший выбор, если я правильно понял все вышеперечисленные подходы. Я сделал ошибки, схватив их? Также есть какой-нибудь другой лучший вариант?