Я хочу вызывать функции Python в Java. Я знаю, что есть Jython, который поставляется с PythonInterpreter для Java, но, к сожалению, он поддерживает только Python 2.7.
Для лучшего объяснения того, что я хочу делать. Скажем, у меня есть следующий код Python в данном файле:
@staticmethod
def my_first_function():
print("Hi!")
@staticmethod
def my_second_function():
print("Hi again!")
Я хочу теперь иметь возможность вызывать такие функции ЯВНО в Java:
PythonToJava pythonToJava = new PythonToJava("my/python/script/path");
pythonToJava.my_second_function();
pythonToJava.my_first_function();
Как я могу использовать / вызвать модуль Python / скрипт / класс / и т. д. в Яве?
Я не хочу вызывать функции Java в Python. Я хочу вызывать функции Python в Java.
Вот что делает ссылка, которую я вам отправил, прочтите - «... Py4J позволяет классам Python реализовывать интерфейсы Java, чтобы JVM могла вызывать объекты Python ...»
Не могли бы вы привести мне пример того, как реализовать это с помощью моего примера кода?
Конечно, вот пример: py4j.org/… Существует код Python, определяющий интерфейс, и код Java для его вызова.




Как насчет использования метода Runtime.exec ()? Вобще Process process = Runtime.getRuntime().exec("python script.py arg1 arg2"). Среда выполнения - это класс из пакета java.lang, поэтому вам не нужно выполнять какие-либо причудливые операции импорта.
РЕДАКТИРОВАТЬ
Хорошо, не так-то просто управлять, если у вас много функций. С другой стороны, если вы не возражаете против кучи файлов-оберток, просто напишите немного кода, чтобы создать их автоматически для каждой функции.
Взгляните на этот небольшой фрагмент кода Python. Просто замените foo тем, что называется у вашего огромного модуля, и все готово.
from inspect import getmembers, isfunction
import foo
f_list=[o[0] for o in getmembers(foo) if isfunction(o[1])]
for x in f_list:
print("Build "+str(x))
with open("helper_"+str(x)+".py","wt") as f:
f.write("""import foo
import sys
arg_list=sys.argv[1::]
print(foo.{x}(*arg_list))""".format(x=x))
Это именно то, чего я не хочу делать. Проблема здесь в том, что я не могу вызвать конкретную функцию. У меня есть модуль Python с сотней функций. Я хочу иметь возможность звонить им индивидуально. Я знаю, что могу сделать это с аргументами (и переключить регистр в скрипте python) или что я могу поместить каждую функцию в отдельный файл, но это было бы безумием. Учитывая, что мне нужно отлаживать здесь и потом, это тоже был бы проблематичный подход.
@TheOnionMaster Понятно, пожалуйста, ознакомьтесь с изменением моего ответа. Это достаточно безумно?
Идеально. Спасибо!
Попробуйте Py4J, он позволяет определить java-интерфейс для кода Python py4j.org/…