Для получения выходных данных подпроцесса построчно, как только подпроцесс очищает свой буфер стандартного вывода:
#!/usr/bin/env python2
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() # wait for the subprocess to exit
iter()
используется для чтения строк, как только они записаны в обходной путь ошибка опережающего чтения в Python 2 .
Если стандартный вывод подпроцесса использует буферизацию блоков вместо буферизации строк в неинтерактивном режиме (что приводит к задержке вывода до тех пор, пока дочерний буфер не заполнится полностью или не будет явно очищен дочерним), тогда вы можете попытаться принудительно вызвать небуферизованный вывод с использованием pexpect
, pty
модулей или unbuffer
, stdbuf
, script
утилит , см. В: Почему бы просто не использовать канал ( POPEN (?))
Вот код Python 3:
#!/usr/bin/env python3
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)
).