Antworten:
Pythons Standardausgang wird gepuffert (was bedeutet, dass einige der Daten, die zum Standardausgang "geschrieben" wurden, gesammelt werden, bevor sie in das Terminal geschrieben werden). Durch das Aufrufen wird sys.stdout.flush()
der Puffer "geleert", was bedeutet, dass alles im Puffer in das Terminal geschrieben wird, auch wenn es normalerweise vorher warten würde.
Hier sind einige gute Informationen zu (un) gepufferten E / A und warum sie nützlich sind:
http://en.wikipedia.org/wiki/Data_buffer Gepufferte vs ungepufferte E /
A.
sys.stdout.write("%d" % i)
, muss ich den Aufruf sys.stdout.flush()
auskommentieren, damit der Puffer angezeigt wird, während das Skript ausgeführt wird.
Betrachten Sie das folgende einfache Python-Skript:
import time
import sys
for i in range(5):
print(i),
#sys.stdout.flush()
time.sleep(1)
Dies ist so konzipiert, dass fünf Sekunden lang jede Sekunde eine Zahl gedruckt wird. Wenn Sie sie jedoch so ausführen, wie sie jetzt ist (abhängig von Ihrer Standardsystempufferung), wird möglicherweise keine Ausgabe angezeigt, bis das Skript abgeschlossen ist, und dann wird auf einmal 0 1 2 3 4
gedruckt auf den Bildschirm.
Dies liegt daran, dass die Ausgabe gepuffert wird und Sie die Ausgabe nicht sofort sehen , wenn Sie nicht sys.stdout
nach jedem print
leeren. Entfernen Sie den Kommentar aus der sys.stdout.flush()
Zeile, um den Unterschied zu sehen.
Nach meinem Verständnis wird die Ausgabe bei jeder Ausführung von Druckanweisungen in den Puffer geschrieben. Und wir werden die Ausgabe auf dem Bildschirm sehen, wenn der Puffer geleert (gelöscht) wird. Standardmäßig wird der Puffer beim Beenden des Programms geleert. ABER WIR KÖNNEN DEN BUFFER AUCH MANUELL SPÜLEN, indem wir die Anweisung "sys.stdout.flush ()" im Programm verwenden. Im folgenden Code wird der Puffer geleert, wenn der Wert von i 5 erreicht.
Sie können dies verstehen, indem Sie den folgenden Code ausführen.
chiru@online:~$ cat flush.py
import time
import sys
for i in range(10):
print i
if i == 5:
print "Flushing buffer"
sys.stdout.flush()
time.sleep(1)
for i in range(10):
print i,
if i == 5:
print "Flushing buffer"
sys.stdout.flush()
chiru@online:~$ python flush.py
0 1 2 3 4 5 Flushing buffer
6 7 8 9 0 1 2 3 4 5 Flushing buffer
6 7 8 9
print i
, um Ihre Ausgabe zu erhalten
Nach meinem Verständnis überträgt sys.stdout.flush () alle Daten, die bis zu diesem Punkt gepuffert wurden, an ein Dateiobjekt. Während der Verwendung von stdout werden Daten im Pufferspeicher gespeichert (für einige Zeit oder bis der Speicher gefüllt ist), bevor sie in das Terminal geschrieben werden. Die Verwendung von flush () erzwingt das Leeren des Puffers und das Schreiben in das Terminal, noch bevor der Puffer leeren Speicherplatz hat.