Получение результата метода python в java возвращает неожиданные результаты

Я пытаюсь распечатать возврат метода на python внутри java. Это мой код Python внутри файла file1.py:

def main():
    return(5)

А вот мой Java-код:

import java.io.*;
public void sampleMethod(){
    try{

        System.out.println(Runtime.getRuntime().exec("cmd /c start file1.py main()"));
    }
    catch (IOException e){
        System.out.println("Failed" + e);
    }
}

Когда бегу, возвращает java.lang.ProcessImpl@12a337b. Каждый раз, когда я запускаю, все после символа @ меняется и кажется случайным.

Ваш код Python ничего не делает, кроме определения функции btw. main не является чем-то особенным в Python, а точка входа скрипта Python каждый - это просто первая строка.

juanpa.arrivillaga 17.12.2018 19:22

Основная причина, по которой у меня есть функция в скрипте python, заключается в том, что может быть оператор return, который, как я думал, мог быть проблемой.

Rab Greenup 17.12.2018 19:24

Правильно. Но ваш скрипт ничего не делает в том смысле, что вы не должны ожидать вывода любой. Похоже, вы печатаете какой-то объект Process. Вы должны посмотреть в документации примеры того, как получить стандартный вывод вашего процесса. Но опять же, ваш скрипт python ничего не выводит на стандартный вывод.

juanpa.arrivillaga 17.12.2018 19:26

Итак, вот документы: docs.oracle.com/javase/7/docs/api/java/lang/Process.html похоже, что вам нужно использовать метод getInputStream, который вернет какой-то файловый объект, я уверен (что вам, вероятно, придется из .read)

juanpa.arrivillaga 17.12.2018 19:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
4
775
3

Ответы 3

Когда вы это сделаете:

System.out.println("Failed" + e);

Вы распечатываете объект IOException с помощью метода toString() по умолчанию. Вы хотите использовать метод getMessage():

System.out.println("Failed" + e.getMessage());

Строка java.lang.ProcessImpl@12a337b, которую вы видите, выглядит так: результат toString() от Process, возвращенный Runtime.getRuntime().exec("....").

Вместо этого вы, вероятно, захотите увидеть код выхода этого процесса (5 в вашем случае). Чтобы получить его, вы должны дождаться завершения процесса, а затем получить его код выхода:

Process process = Runtime.getRuntime().exec("cmd /c start file1.py main()");
process.waitFor();
int exitCode = process.exitValue();
System.out.println(exitCode);

Для получения дополнительной информации см. Javadoc Object.toString(), Process.waitFor() и Process.exitValue().

Я подозреваю, что они действительно хотят читать из стандартного вывода процесса.

juanpa.arrivillaga 17.12.2018 19:33
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sys\nsys.path.append('pathToModules if they are not there by default')\nimport yourModule");
// execute a function that takes a string and returns a string
PyObject someFunc = interpreter.get("funcName");
PyObject result = someFunc.__call__(new PyString("Test!"));
String realResult = (String) result.__tojava__(String.class);

попробуй

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