Я пытаюсь напечатать stdout в реальном времени для подпроцесса, но похоже, что stdout буферизуется даже с bufsize = 0, и я не могу понять, как заставить его работать, у меня всегда есть задержка.Печать вывода в реальном времени из подпроцесса
Код я пробовал:
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
bufsize=0)
line = p.stdout.readline()
while line:
sys.stdout.write(line)
sys.stdout.flush()
# DO OTHER STUFF
line = p.stdout.readline()
Также попытался с for line in iter(p.stdout.readline, b'')
вместо петли в то время как и с read(1)
вместо readline()
. Всегда один и тот же результат, выход задерживается на несколько секунд или минут, и сразу появляется несколько строк.
То, что я думаю, что происходит:
bufsize
устанавливается в 0 (устанавливаются в 0 по умолчанию в соответствии с Документами), так что линии конвейера p.stdout
должен быть доступны немедленно. Но так как p.stdout.readline()
не возвращается сразу же, когда новая строка передается по трубопроводу, это означает, что она буферизована, поэтому сразу несколько строк, когда буфер окончательно сброшен на p.stdout
.
Что я могу сделать, чтобы это сработало?
связанные с: [ловить стандартный вывод в реальном времени от подпроцесса] (http://stackoverflow.com/q/18273962/4279) – jfs
связанные: [Python подпроцесса readlines() виснет] (http://stackoverflow.com/q/12419198/4279) – jfs
К сожалению, вы нашли свой последний комментарий после поиска решения. Все еще поддерживается, потому что ответ соответствует моей проблеме. – Nolhian