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