Щоб отримати підпроцес вихідний рядок за рядком, як тільки підпроцес очистить свій буфер 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, який виводить підпроцеси bytestring як є; Python 3 використовує текстовий режим (вихід cmd декодується за допомогою locale.getpreferredencoding(False)
кодування).