Warum python-print-Anweisungen, die enthalten " end=' Argumente Verhalten sich anders in while-Schleifen?
Ich bin mit python version 2.7.3 auf MacOSX.
Betrachten dieser code-block:
from __future__ import print_function
import time
x = 0
while x < 5:
print(x)
x += 1
time.sleep(1)
Wenn ich dieses Skript ausführen, ich beobachte die Ausgabe, die ich erwartet: Die zahlen 0
durch 4
mit einem \n
Zeichen angehängt zu jeder Zahl. Darüber hinaus ist jede Zahl zeigt nach einer Sekunde pause.
0
1
2
3
4
Betrachten Sie nun diese code-block:
from __future__ import print_function
import time
x = 0
while x < 5:
print(x, end='')
x += 1
time.sleep(1)
Die Ausgabe ist das, was ich erwarte, 01234
ohne die \n
's, aber die timing unerwartet. Anstatt jede Ziffer nach einem ein-Sekunden-pause, der Prozess wartet vier Sekunden, zeigt dann alle fünf zahlen.
Warum print('string')
Verhalten sich anders als print('string', end='')
in while-Schleifen? Gibt es eine Möglichkeit, die Anzeige der Zeichen, ohne Zeilenumbrüche, eine Sekunde bei einer Zeit? Ich habe versucht sys.stdout.write(str(x))
, aber es verhält sich auf die gleiche Weise wie print(end='')
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil die Ausgabe-stream-line-buffered - da es nicht explizit geleert werden zwischen print-Anweisungen, er wartet, bis er sieht ein newline Spülen, um die Ausgabe.
Können Sie erzwingen, dass die Spülung über
sys.stdout.flush()
.Alternativ, wenn Sie ausführen, Python
-u
flag, wird es deaktivieren Sie die Zeile Pufferung.print(x, end='', flush=True)
wird aso-ArbeitDies ist nur python-Pufferung von stdout. Diese Antwort hat ein paar mehr Infos.
Können Sie Spülen Sie es wie diese:
Alternativ starten Sie python
python -u
und es wird nicht gepuffert werden.