Чтобы получить вывод подпроцесса построчно, как только подпроцесс очищает свой буфер stdout:
from subprocess import Popen, PIPE
p = Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1)
with p.stdout:
for line in iter(p.stdout.readline, b''):
print line,
p.wait()
iter()используется для чтения строк, как только они написаны, для обхода ошибки упреждающего чтения в Python 2 .
Если stdout подпроцесса использует блочную буферизацию вместо буферизации строки в неинтерактивном режиме (что приводит к задержке вывода до тех пор, пока дочерний буфер не заполнится или не будет явно очищен дочерним элементом), вы можете попытаться принудительно выполнить небуферизованный вывод, используя pexpect, ptyмодули или unbuffer, stdbuf, scriptутилиты , см Q: Почему бы не просто использовать трубу (POPEN ())?
Вот код Python 3:
from subprocess import Popen, PIPE
with Popen(["cmd", "arg1"], stdout=PIPE, bufsize=1,
universal_newlines=True) as p:
for line in p.stdout:
print(line, end='')
Примечание. В отличие от Python 2, который выводит байтовые строки подпроцесса как есть; Python 3 использует текстовый режим (вывод cmd декодируется с использованием locale.getpreferredencoding(False)кодировки).