2010-05-12 11 views
7

Ich versuche, ein einfaches Tool zu schreiben, das Dateien von CD liest, einige Bildverarbeitung macht und das Ergebnis des Algorithmus zurückgibt. Da das Programm manchmal eine Weile dauern kann, habe ich gerne einen Fortschrittsbalken, damit ich weiß, wo es im Programm ist. Und da ich meine Befehlszeile nicht überladen möchte und ich auf einer Unix-Plattform bin, wollte ich das '\ r'-Zeichen verwenden, um den Fortschrittsbalken nur in einer Zeile zu drucken.Python Print-Anweisung druckt nichts mit einem Wagenrücklauf

Aber wenn ich diesen Code hier habe, druckt es nichts.

Ich habe auch versucht:


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

Jetzt nur sicherstellen, das in Python gearbeitet, habe ich versucht, dies:


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

Dieser Code funktioniert perfekt. Was ist los? Mein Verständnis von Wagenrücklauf unter Linux war, dass es nur das Zeilenvorschubzeichen an den Anfang verschieben würde und dann könnte ich alten Text, der zuvor geschrieben wurde, überschreiben, solange ich keinen Zeilenvorschub irgendwo ausdrucke. Dies scheint jedoch nicht zu passieren.

Gibt es auch eine bessere Möglichkeit, einen Fortschrittsbalken in einer Befehlszeile anzuzeigen als was ich gerade versuche?

+3

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

Antwort

10

Try sys.stdout.flush() nach der print-Anweisung hinzufügen. Es ist möglich, dass print die Ausgabe nicht löscht, bis eine neue Zeile geschrieben wird, was hier nicht passiert.

+0

Ja, das war es. Immer noch nicht ganz sicher, warum das Hello-World-Beispiel funktioniert hat. Es hat auch keinen Zeilenvorschub ausgegeben. Vielleicht, weil die print-Anweisung so weit ausgeführt wurde, dass der Puffer nach einer bestimmten Anzahl von Zeichen automatisch gelöscht wurde? –

+0

Ja, es muss den Puffer geleert haben, als es voll wurde. – interjay

+0

Alternativ kann man 'sys.stderr ', um sofort auf den Bildschirm zu drucken. Standardmäßig ist 'stderr' ungepuffert. – amphetamachine

2

Die Handhabung von Wagenrückläufen in Linux unterscheidet sich stark zwischen Terminal-Emulatoren.

Normalerweise würde man Terminal-Escape-Codes verwenden, die den Terminal-Emulator anweisen würden, den virtuellen "Wagen" um den Bildschirm herum zu bewegen (denkt an Vollbild-Programme, die über BBS-Linien laufen). Die, die ich bin mir dessen bewusst sind die VT100-Escape-Codes:

\e[A: bis
\e[B: down
\e[C: rechts
\e[D: links
\e[1~: home
\e[4~: Ende

Wobei \e das Escape-Zeichen ist, \x1b.

versuchen, alle \r ‚s mit \e[1~ ersetzt

Siehe auch this post

+0

Warum würde dann sein zweites Beispiel funktionieren? – danben

2

Wenn Ihr Terminal liniengepuffert ist, benötigen Sie möglicherweise eine sys.stdout.flush(), um Ihren Ausdruck zu sehen, wenn Sie keinen Zeilenvorschub ausgeben.

Verwandte Themen