sys.stdout.flush()メソッドの使用法


回答:


173

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

ここでは(UN)に関するいくつかの良い情報だI / Oとなぜそれが便利ですが、バッファ:
http://en.wikipedia.org/wiki/Data_buffer
バッファバッファなしIO対


@Ciastopiekarz Windowsでバッファをフラッシュするにはどうすればよいですか?
helplessKirk 2015年

@Ciastopiekarzどのように考えますか?Andrew ClarkのPythonスクリプトを使用して、print行をに置き換えたsys.stdout.write("%d" % i)場合、への呼び出しのコメントsys.stdout.flush()を外して、スクリプトの実行中に表示するバッファーを取得する必要があります。
ベーコンビット

119

次の単純なPythonスクリプトを考えてみます。

import time
import sys

for i in range(5):
    print(i),
    #sys.stdout.flush()
    time.sleep(1)

これは、毎秒1つの数値を5秒間印刷するように設計されていますが、現在の状態で実行すると(デフォルトのシステムバッファリングによって異なります)、スクリプトが完了するまで出力が表示0 1 2 3 4されず、一度にすべてが印刷されます。画面に。

これは、出力がバッファリングされているためであり、sys.stdout毎回フラッシュしない限りprint、出力はすぐには表示されません。sys.stdout.flush()行からコメントを削除して、違いを確認します。


48
Python 3.xでは、 'print i'をprint(i、end = '')に置き換える必要があります。これは、Python 3のprint()にコンソールのフラッシュを促すデフォルトのプレフィックスend = '\ n'があるためです。
ofer.sheffer 2014

5
私は混乱しています。コンマを削除すると、期待どおりに機能します。新しい行のバッファロジックはありますか?
Sunil Lulla

7

私の理解によると、印刷ステートメントを実行すると、出力は常にバッファに書き込まれます。バッファーがフラッシュ(クリア)されると、画面に出力が表示されます。デフォルトでは、プログラムの終了時にバッファがフラッシュされます。ただし、プログラムで「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

print i出力を取得するためにの後にカンマがありません
SwimBikeRun

1
import sys
for x in range(10000):
    print "HAPPY >> %s <<\r" % str(x),
    sys.stdout.flush()

1

私の理解によると、sys.stdout.flush()は、バッファリングされたすべてのデータをそのポイントまでファイルオブジェクトにプッシュします。stdoutの使用中、データは端末に書き込まれる前に(しばらくの間、またはメモリがいっぱいになるまで)バッファメモリに格納されます。flush()を使用すると、バッファーに空のスペースができる前であっても、強制的にバッファーを空にして端末に書き込みます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.