Вызов функций Python 3.x в Java

Я хочу вызывать функции 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 / скрипт / класс / и т. д. в Яве?

Попробуйте Py4J, он позволяет определить java-интерфейс для кода Python py4j.org/…

nosklo 09.10.2018 16:25

Я не хочу вызывать функции Java в Python. Я хочу вызывать функции Python в Java.

Faram 09.10.2018 16:47

Вот что делает ссылка, которую я вам отправил, прочтите - «... Py4J позволяет классам Python реализовывать интерфейсы Java, чтобы JVM могла вызывать объекты Python ...»

nosklo 09.10.2018 17:34

Не могли бы вы привести мне пример того, как реализовать это с помощью моего примера кода?

Faram 10.10.2018 08:54

Конечно, вот пример: py4j.org/… Существует код Python, определяющий интерфейс, и код Java для его вызова.

nosklo 10.10.2018 16:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
1 992
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как насчет использования метода 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) или что я могу поместить каждую функцию в отдельный файл, но это было бы безумием. Учитывая, что мне нужно отлаживать здесь и потом, это тоже был бы проблематичный подход.

Faram 10.10.2018 08:52

@TheOnionMaster Понятно, пожалуйста, ознакомьтесь с изменением моего ответа. Это достаточно безумно?

GiulioP 10.10.2018 14:51

Идеально. Спасибо!

Faram 10.10.2018 17:08

Другие вопросы по теме