BufferedReader приостанавливает работу на .readLine () при использовании ProcessBuilder для выполнения простого скрипта Python

Я пытаюсь использовать ProcessBuilder для выполнения простого скрипта python из CMD, который печатает в командной строке, затем этот текст читается в Java и выводится через System.out.println () в netbeans. Моя проблема в том, что BufferedReader, кажется, останавливается на .readLine (), а затем выводит текст сразу после того, как скрипт py перестал работать, в отличие от вывода в реальном времени.

Мой процесс выглядит следующим образом:

[выполнить скрипт python]

Executors.newSingleThreadExecutor().execute(this::TEST);

[запустить выполнение]

public void TEST(){
    try {
        ProcessBuilder py = new ProcessBuilder("cmd", "/C", "C:\\Users\\Documents\\TEST.py");
        String readLine;
        Process launch = py.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(launch.getInputStream()));
        while((readLine = reader.readLine()) != null){
            System.out.println(readLine);
        }
    } catch (IOException ex) {Logger.getLogger(Template.class.getName()).log(Level.SEVERE, null, ex);}
}

[вот сценарий Python, который я хочу запустить и прочитать в прямом эфире]

import Tkinter, tkFileDialog, tkMessageBox


root = Tkinter.Tk()
root.withdraw()
root.resizable(width=Tkinter.TRUE, height=Tkinter.TRUE)
root.geometry('{}x{}'.format(400,600))

print("hello1\n")
print("hello2\n")
print("hello3\n")
print("hello4\n")
print("hello5\n")
tkMessageBox.showinfo("Complete!", "testing")
print("hello6\n")
print("hello7\n")
print("hello8\n")
print("hello9\n")
print("hello10\n")
tkMessageBox.showinfo("Complete!", "testing")

Спасибо!!!


person Harry    schedule 23.02.2018    source источник


Ответы (2)


Во-первых: ваша команда ничего не делает. Это cmd /C C:\Users\Documents\TEST.py, который ничего не делает, кроме как сообщает вам, что C:\Users\Documents\TEST.py не является командой. Вам нужно будет позвонить cmd /C start C:\Users\Documents\TEST.py, чтобы он что-то сделал.

Тем не менее, это не заставит ваш код работать. Проблема здесь в том, что вы вызываете cmd, там вы запускаете процесс python. Теперь, когда вы захватываете поток ввода, вы получаете поток ввода cmd, который не является тем, который вы ищете.

Чтобы заставить его работать, вызовите python напрямую, вызвав python C:\Users\Documents\TEST.py. Убедитесь, что в вашем PATH есть питон, чтобы это работало.

Тогда ваш код должен выглядеть примерно так:

try
{
    ProcessBuilder py = new ProcessBuilder("python", "C:\\Users\\Documents\\TEST.py");
    String readLine;
    Process launch = py.start();
    BufferedReader reader = new BufferedReader(new InputStreamReader(launch.getInputStream()));
    while ((readLine = reader.readLine()) != null)
    {
        System.out.println(readLine);
    }
}
catch (IOException ex)
{
    Logger.getLogger(Template.class.getName()).log(Level.SEVERE, null, ex);
}

Это дает вам именно тот результат, который вы искали.

person Ben    schedule 23.02.2018
comment
Спасибо за ответ. У меня есть python в PATH, но при выполнении команд с помощью ProcessBuilder не учитывается ли переменная PATH. Поэтому я могу заставить его работать только в том случае, если я использую абсолютный путь к python, что дает мне ту же проблему. Есть идеи, как заставить работать Python? - person Harry; 23.02.2018
comment
Если это на вашем пути, это должно сработать. Вы пробовали перезагрузить IDE / ПК? - person Ben; 23.02.2018
comment
Хорошо, я перезапустил свой ноутбук, и теперь python работает нормально. Но по какой-то причине мои результаты все еще остаются в большом объеме после завершения скрипта. - person Harry; 23.02.2018

Распространенная проблема может заключаться в том, что вы не промыли свой Python std. Рекомендую добавить

import sys

# your code here...

sys.stdout.flush()

в свой код, чтобы очистить вывод Python.

person Kingsly2407    schedule 03.06.2021