何をしsys.stdout.flush()
ますか?
6 に答える
Python の標準出力はバッファリングされています (つまり、標準出力に「書き込まれた」データの一部を端末に書き込む前に収集します)。呼び出すsys.stdout.flush()
と、強制的にバッファが「フラッシュ」されます。つまり、バッファ内のすべてがターミナルに書き込まれます。通常はそうする前に待機します。
(un)buffered I/O とそれが役立つ理由についての良い情報を以下に示します:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO
次の単純な Python スクリプトを考えてみましょう。
import time
import sys
for i in range(5):
print(i),
#sys.stdout.flush()
time.sleep(1)
これは 1 秒ごとに 1 つの数値を 5 秒間出力するように設計されていますが、このまま実行すると (デフォルトのシステム バッファリングによっては) スクリプトが完了するまで出力が表示されず、一度に出力が表示0 1 2 3 4
されます。画面に。
これは、出力がバッファリングされているためであり、sys.stdout
それぞれの後にフラッシュしない限りprint
、出力がすぐに表示されないためです。行からコメントを削除しsys.stdout.flush()
て違いを確認してください。
私の理解によると、印刷ステートメントの出力を実行するたびに、バッファに書き込まれます。そして、バッファがフラッシュ(クリア)されると、画面に出力が表示されます。デフォルトでは、プログラムの終了時にバッファがフラッシュされます。しかし、プログラムで「sys.stdout.flush()」ステートメントを使用して、バッファを手動でフラッシュすることもできます。以下のコードでは、i の値が 5 に達するとバッファがフラッシュされます。
以下のコードを実行すると理解できます。
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
import sys
for x in range(10000):
print "HAPPY >> %s <<\r" % str(x),
sys.stdout.flush()
これら2つのb / wの違いを見ることができます
import sys
for i in range(1,10 ):
sys.stdout.write(str(i))
sys.stdout.flush()
for i in range(1,10 ):
print i
最初のケースでは、フラッシュのために、各文字が書き込まれた後に文字が 1 つずつ出力されます。2 番目のケースでは、文字は Python によってバッファリングされ、書き込む価値があると判断された後、すべてがバッチで書き込まれます。
たとえばtime.sleep(0.2)
、ループに a を追加すると、これはより明白になります。