So erhalten Sie die Ausgabe des Unterprozesses zeilenweise, sobald der Unterprozess seinen Standardpuffer geleert hat:
#!/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()
wird verwendet, um Zeilen zu lesen, sobald sie geschrieben wurden, um den Read-Ahead-Fehler in Python 2 zu umgehen .
Wenn stdout des Unterprozesses im nicht interaktiven Modus eine Blockpufferung anstelle einer Zeilenpufferung verwendet (was zu einer Verzögerung der Ausgabe führt, bis der Puffer des Kindes voll ist oder vom Kind explizit geleert wird), können Sie versuchen, eine ungepufferte Ausgabe mit zu erzwingen pexpect
, pty
Module oder unbuffer
, stdbuf
, script
Dienstprogramme , siehe F: Warum nicht einfach ein Rohr verwenden (popen ())?
Hier ist Python 3-Code:
#!/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='')
Hinweis: Im Gegensatz zu Python 2, das die Bytestrings des Unterprozesses unverändert ausgibt. Python 3 verwendet den Textmodus (die Ausgabe von cmd wird mithilfe der locale.getpreferredencoding(False)
Codierung dekodiert ).