Aby uzyskać dane wyjściowe podprocesu wiersz po wierszu, gdy tylko podproces opróżni swój standardowy bufor:
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()służy do odczytywania wierszy, gdy tylko zostaną napisane, w celu obejścia błędu odczytu z wyprzedzeniem w Pythonie 2 .
Jeśli standardowe wyjście podprocesu używa buforowania blokowego zamiast buforowania linii w trybie nieinteraktywnym (co prowadzi do opóźnienia w wyjściu do momentu pełnego lub opróżnienia bufora dziecka), można spróbować wymusić niebuforowane wyjście za pomocą pexpect, ptymoduły lub unbuffer, stdbuf, scriptnarzędzia , patrz P: Dlaczego nie wystarczy użyć rury (popen ())?
Oto kod w Pythonie 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='')
Uwaga: W przeciwieństwie do Pythona 2, który generuje bajty podprocesów bez zmian; Python 3 używa trybu tekstowego (wyjście cmd jest dekodowane przy użyciu locale.getpreferredencoding(False)kodowania).