2010-05-12 8 views
7

Próbuję napisać proste narzędzie, które odczytuje pliki z dysku, przetwarza obraz i zwraca wynik algorytmu. Ponieważ program może czasami zająć trochę czasu, lubię mieć pasek postępu, więc wiem, gdzie jest w programie. A ponieważ nie lubię zaśmiecać mojej linii poleceń i jestem na platformie Unix, chciałem użyć znaku "\ r", aby wydrukować pasek postępu tylko na jednej linii.Python print nic nie wypisuje znakiem powrotu karetki

Ale kiedy mam tutaj ten kod, nic nie drukuje.

Próbowałem również:


print '\r', i, '/', len(files), 

Teraz wystarczy, aby upewnić się ten pracował w Pythonie, próbowałem to:


heartbeat = 1 
while True: 
    print '\rHello, world', heartbeat, 
    heartbeat += 1 

Ten kod działa doskonale. Co się dzieje? Moje rozumienie powrotu karetki w Linuksie polegało na tym, że po prostu przesuwałbym znak linii na początek, a następnie mogłem zastąpić stary tekst, który został wcześniej napisany, o ile nie nigdzie nie drukuję linii nowej. Wydaje się, że to się nie dzieje.

Czy istnieje lepszy sposób wyświetlania paska postępu w wierszu poleceń niż obecnie próbuję wykonać?

+3

http://pypi.python.org/pypi/progressbar – kennytm

Odpowiedz

10

spróbuj dodać sys.stdout.flush() po instrukcji print. Możliwe, że print nie wypróżnia wyjścia, dopóki nie napisze nowej linii, co nie ma tu miejsca.

+0

Tak, to zrobiło. Nadal nie do końca wiadomo, dlaczego działa przykład Witam świecie. Nie wystawiono również linii. Może dlatego, że instrukcja print działała na tyle, że automatycznie przepłukała bufor po określonej liczbie znaków? –

+0

Tak, to musiało przepłukać bufor, gdy się zapełniło. – interjay

+0

Alternatywnie można użyć 'sys.stderr' do natychmiastowego drukowania na ekranie. Domyślnie 'stderr' jest niebuforowany. – amphetamachine

2

Obsługa powrotów karetki w systemie Linux różni się znacznie między emulatorami terminali.

Zwykle można użyć kodów ewakuacyjnych terminalu, które informowałyby emulator terminala, że ​​przesuwa wirtualny "wózek" po ekranie (pomyśl o programach pełnoekranowych biegnących nad liniami BBS). Te, jestem świadomy są kody VT100 ucieczki:

\e[A: do
\e[B: Precz
\e[C: prawo
\e[D: lewy
\e[1~: dom
\e[4~: koniec

Gdzie \e jest znakiem ucieczki, \x1b.

Spróbuj wymienić wszystkie \r „s ze \e[1~

także zobaczyć this post

+0

Dlaczego miałby więc działać jego drugi przykład? – danben

2

Jeśli twój terminal jest buforowany liniowo, być może będziesz potrzebował sys.stdout.flush(), aby zobaczyć drukowanie, jeśli nie wysyłasz linii.

Powiązane problemy