2011-09-18 25 views
9

Niedawno zmieniłem system operacyjny i używam nowszego Pythona (2.7). W moim starym systemie byłem w stanie drukować natychmiastowo. Na przykład, załóżmy, że miałem obliczeniowo intensywne pętli for:funkcja drukowania Pythona w czasie rzeczywistym

for i in range(10): 
    huge calculation 
    print i 

następnie jako kod zakończonego każdej iteracji, to wydrukować i

Jednak na moim obecnym systemie, python zdaje się buforować stdout, tak aby terminal jest pusty przez kilka minut, po czym drukuje:

 
1 
2 
3 

w krótkim odstępie czasu. Następnie, po kilku minutach, drukuje:

 
4 
5 
6 

i tak dalej. Jak mogę utworzyć drukowanie w języku Python zaraz po osiągnięciu oświadczenia print?

+0

Tak ... to nie jest Python. –

Odpowiedz

8

Spróbuj wywołać przypływ stdout po druku

import sys 

... 
sys.stdout.flush() 

Lub użyć opcji -u command line których:

Siła stdin, stdout i stderr być całkowicie niebuforowana.

+0

Dzięki! To działa, ale czy wiesz, jak ustawić to automatycznie? – Rishi

+2

@Rishi: Najbliższe, co można uzyskać automatycznie (bez konieczności uciekania się do kompilowania własnej wersji pythona) byłoby ustawienie zmiennej środowiskowej 'PYTHONUNBUFFERED'. –

+0

Komentarz Jeffa był dla mnie bardzo przydatny. Dziękuję – Rishi

1

Importuj nowy print-as-function jak w Pythonie 3.x:

from __future__ import print_function 

(umieścić oświadczenie w górnej części skryptu/modułu)

Pozwala to na zastąpienie nowa funkcja drukowania własna:

def print(s, end='\n', file=sys.stdout): 
    file.write(s + end) 
    file.flush() 

Zaletą jest to, że w ten sposób twój skrypt będzie działać tak samo, gdy uaktualnisz jeden dzień do wersji 3.x Pythona.

Ps1: Nie wypróbowałem tego, ale funkcja print-as mogła domyślnie być domyślnie opróżniana.

PS2: możesz również być zainteresowany moim progressbar example.

+0

Przepraszam, @Rishi, Potwierdziłem ponowne napisanie mojej odpowiedzi prawdopodobnie zaraz po obejrzeniu poprzedniej wersji. – Remi

6

Od wersji Python 3.3 można po prostu przekazać flush=True do funkcji drukowania.

Powiązane problemy