213

何をしsys.stdout.flush()ますか?

4

6 に答える 6

213

Python の標準出力はバッファリングされています (つまり、標準出力に「書き込まれた」データの一部を端末に書き込む前に収集します)。呼び出すsys.stdout.flush()と、強制的にバッファが「フラッシュ」されます。つまり、バッファ内のすべてがターミナルに書き込まれます。通常はそうする前に待機します。

(un)buffered I/O とそれが役立つ理由についての良い情報を以下に示します:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO

于 2012-04-04T21:35:18.087 に答える
144

次の単純な 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()て違いを確認してください。

于 2012-04-04T21:34:48.513 に答える
10

私の理解によると、印刷ステートメントの出力を実行するたびに、バッファに書き込まれます。そして、バッファがフラッシュ(クリア)されると、画面に出力が表示されます。デフォルトでは、プログラムの終了時にバッファがフラッシュされます。しかし、プログラムで「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
于 2015-10-27T09:41:22.297 に答える
2
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()
于 2016-08-28T07:12:10.537 に答える
1

これら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 を追加すると、これはより明白になります。

于 2020-08-10T03:52:47.173 に答える