2009-07-26 26 views
20

Próbuję odczytać z procesu, który generuje długi i czasochłonny wydruk. Jednak chcę złapać jego wyjście , jak i kiedy jest produkowany. Ale używając coś jak poniżej wydaje się być buforowanie wyjścia polecenia, więc w końcu się linie wyjściowe wszystko naraz:Niebuforowany odczyt z procesu przy użyciu podprocesu w Pythonie

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, bufsize=0) 
    for line in p.stdout: 
     print line 

próbuję to na MacOS 10.5

+0

Duplikat: http://stackoverflow.com/questions/874815/how-do-i-get-real-time-information-back-from -a-subprocess-popen-in-python-2-5, http://stackoverflow.com/questions/527197/intercepting-stdout-a-subprocess-while-it-is-running –

Odpowiedz

28

Plik iterator robi niektóre buforowanie wewnętrzne on its own. Spróbuj tego:

line = p.stdout.readline() 
while line: 
    print line 
    line = p.stdout.readline() 
+0

Działa świetnie. Dzięki! – Abhi

+0

Dziękuję, uratowałeś mi trochę ciągnięcia za włosy. – haridsv

6

Zazwyczaj każdy program zrobi więcej buforowanie na swoich kanałach wejściowych i/lub wyjściowych, niż wydaje się pragnąć ... chyba to nabrać przekonania wspomniany kanał rzeczywiście terminal!

Do tego celu "oszukiwanie w dobrej sprawie", użyj pexpect - działa dobrze na Macu (życie jest trudniejsze w Windowsie, chociaż istnieją rozwiązania, które mogą pomóc nawet tam - na szczęście nie musimy rozmyślaj nad tymi, kiedy używasz Maca).

3

To był rzeczywiście błąd, który został rozwiązany w Pythonie 2.6: http://bugs.python.org/issue3907

+4

Na pytonie 2.7 'dla linii w p.stdout' nadal opóźnia swoje wyjście, podczas gdy' dla linii w iter (p.stdout.readline, b '') 'działa zgodnie z oczekiwaniami (tworzy linie, gdy tylko są dostępne). – jfs

+0

Niestety, 2.x nie będzie używać domyślnie nowej biblioteki io, jak mówi ostatni komentarz do raportu o błędzie; Będziesz musiał zrobić coś w stylu 'dla linii w io.open (p.stdin.fileno())'. – Ari

+1

@Ari: Czy powinno to być 'dla linii w io.open (p.stdout.fileno())'? –

Powiązane problemy