Мои основные требования таковы:
- вызов должен быть прозрачным в том смысле, что он не должен требовать изменения файла .py просто для того, чтобы его можно было вызывать из Java. Мне может быть предоставлен любой файл Python с некоторыми функциями внутри него. Я должен иметь возможность вызывать любую из этих функций без необходимости изменения файла .py.
- Я хочу иметь возможность отправлять аргументы обоих примитивных типов (и т. д.) или не примитивные типы (
Код: Выделить всё
int, String, float) из функции Java в Python и получить обратно возвращенный объект (который может иметь примитивные или непримитивные типы) из Python в Java. Я также использую pandas DataFrame и numpy ndarray и, следовательно, также хочу иметь возможность отправлять и получать соответствующие объекты в Java и обратно.Код: Выделить всё
HashMap,ArrayList - Я предпочтительно хочу придерживаться на CPython вместо Jython, потому что мне, возможно, придется использовать более новые библиотеки, которые могут быть недоступны в Jython.
- Использовать PythonInterpreter Jython, с помощью которого я могу вызывать функцию Python, не требуя каких-либо изменения в файле сценария .py:
py1.py
JythonTest.groovyКод: Выделить всё
def square2(list): squares = [] for i in list: squares.append(i*i) return squares
Я вполне могу удовлетворить свои потребности. Но это не CPython.Код: Выделить всё
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 } } - Используйте ScriptEngine: это очень похоже на PythonInterpreter. Но против Jython. Кроме того, в отличие от PythonInterpreter, мы не можем работать с Jython 2.5+ и не можем напрямую обращаться к PyObjects. Так что эту опцию можно очень хорошо закрыть.
- Используйте py4j: не могу найти такой же минимальный пример, как в случае Jython PythonInterpreter
Используйте java2python. Но о вызове Python из Java дано не так много информации, чтобы я мог сделать вывод, могут ли быть удовлетворены мои вышеуказанные требования. Может ли кто-нибудь пролить больше света на это? Точнее, если мы сможем написать минимальный код, аналогичный коду в Jython PythonInterpreter. - Используйте JPype: Однако после быстрого изучения я чувствую, что не смогу писать минимальный код, как в случае Jython PythonInterpreter. Также мне показалось, что проект несколько не в стадии разработки. Так ли это?
Подробнее здесь: https://stackoverflow.com/questions/394 ... -from-java