Ошибка при запуске скрипта Python из Java

Я пытался вызвать программу Python 3.x из Java. Мне нужно получить вывод из python и записать его в файл. Это то, что я сделал. Это создает файл Json, но не дает выходных данных. Пожалуйста, помогите мне здесь.

public static void main(String[] args) throws ScriptException, IOException {
    Process p = Runtime.getRuntime().exec("python <path to the file>/reg.py");
    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String ret = in.readLine();
    System.out.println(ret);

    BufferedWriter out = new BufferedWriter(new FileWriter("<some path>/output.json"));
    out.write(ret);
    out.close();
}

Попробуйте сбросить модуль записи перед закрытием, например, out.flush().

Santosh 15.02.2019 15:46

Пытался. но он дает тот же результат, что и «нулевой». Но когда я запускаю этот файл непосредственно из командной строки, он дает желаемый результат.

Yurizen 15.02.2019 15:49

Вы имеете в виду, что ваш json содержит «ноль».

Santosh 15.02.2019 15:50

это, кажется, больше проблема в вашем коде Python, читает ли он относительные пути или что-то в этом роде?

Patrick.H 15.02.2019 15:51

Вы читаете только одну строку. Выводит ли скрипт python полный JSON в одну строку?

mnesarco 15.02.2019 15:51

@Santosh, нет, файл JSON не выходит пустым, «null» - это то, что я получаю в консоли моего редактора Java вместе с «Exception in thread «main» java.lang.NullPointerException в java.io.Writer.write( Writer.java:157) в invoke.RunPython.main(RunPython.java:22)"

Yurizen 15.02.2019 15:52

@mnesarco, нет, это около 4 строк вывода, но это должно дать мне хотя бы первую строку.

Yurizen 15.02.2019 15:54

Я бы сделал две вещи: во-первых, проверьте из консоли, возвращает ли «python <путь к файлу>/reg.py» какой-либо вывод. Проверьте, является ли <путь к файлу> абсолютным. Затем замените в своем коде вызов python, например, на «echo blablabla» и посмотрите, появляется ли blablabla в вашем output.json. Нам нужно выяснить, является ли сценарий py неправильным или это вызов.

mate00 15.02.2019 15:55

Вы уверены, что скрипт Python печатает в stdout, а не в stderr? В последнем случае вам нужно будет прочитать из p.getErrorStream().

yegodm 15.02.2019 15:57

вы пробовали: Process p = Runtime.getRuntime().exec("<путь к python>/python <путь к файлу>/reg.py");

mnesarco 15.02.2019 16:01

@ mate00, я только что проверил, он выдает ошибки, если я запускаю такой код: «python <путь к файлу>/reg.py». Но если я перехожу прямо в каталог из терминала и запускаю его, все работает отлично.

Yurizen 15.02.2019 16:02

Есть ли у вашей Java-программы необходимые разрешения для выполнения и записи в целевой каталог (при условии, что вы используете ОС * nix)?

Susmit Agrawal 15.02.2019 16:02

И какие ошибки у вас возникают? Можете ли вы вставить это здесь?

mate00 15.02.2019 16:03

@mate00: Traceback (последний последний вызов): Файл "<путь к файлу>/reg.py", строка 170, в <модуле> send() Файл "/<путь к файлу>reg.py", строка 12, в строках отправки = open("output.txt",encoding = "utf-8").readlines() FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'output.txt'

Yurizen 15.02.2019 16:07

@SusmitAgrawal Я на Windows 10

Yurizen 15.02.2019 16:09

@mnesarco пробовал, не получилось

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

Ответы 1

Итак, после нашего разговора в комментариях ваш скрипт выдает ошибку, потому что не может найти файл output.txt. Теперь дело в том, что это регистрируется в потоке ошибок, а не в обычном. Что вам нужно сделать, так это открыть этот поток и прочитать его:

BufferedReader in = new BufferedReader(new InputStreamReader(p.getErrorStream()));

Фактически, вы можете открыть оба потока: errorStream и outputStream и сначала прочитать поток ошибок, чтобы проверить, содержит ли он что-то (это означает, что выполнение не удалось). Если это не так, откройте outputStream и нормально прочитайте его содержимое.

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