Чтобы получить вывод подпроцесса построчно, как только подпроцесс очищает свой буфер 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)
кодировки).