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.
@Ciastopiekarz Was können wir tun, um den Puffer unter Windows zu leeren?
helplessKirk
@Ciastopiekarz Wie findest du das? Wenn ich Andrew Clarks Python-Skript nehme und die Druckzeile durch ersetze 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.
Bacon Bits
119
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 4gedruckt auf den Bildschirm.
Dies liegt daran, dass die Ausgabe gepuffert wird und Sie die Ausgabe nicht sofort sehen , wenn Sie nicht sys.stdoutnach jedem printleeren. Entfernen Sie den Kommentar aus der sys.stdout.flush()Zeile, um den Unterschied zu sehen.
In Python 3.x sollte 'print i' durch print (i, end = '') ersetzt werden, da print () in Python 3 das Standardpräfix end = '\ n' hat, das die Konsole zum Leeren auffordert.
ofer.sheffer
5
Ich bin nur verwirrt, wenn ich das Komma entferne, funktioniert es wie erwartet. Gibt es eine Pufferlogik für neue Zeilen?
Sunil Lulla
7
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()
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.
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.
quelle
sys.stdout.write("%d" % i)
, muss ich den Aufrufsys.stdout.flush()
auskommentieren, damit der Puffer angezeigt wird, während das Skript ausgeführt wird.Betrachten Sie das folgende einfache Python-Skript:
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 jedemprint
leeren. Entfernen Sie den Kommentar aus dersys.stdout.flush()
Zeile, um den Unterschied zu sehen.quelle
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.
quelle
print i
, um Ihre Ausgabe zu erhaltenquelle
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.
quelle