sys.stdout.flush()
は何をしますか?
Pythonの標準出力はバッファリングされます(つまり、端末に書き込む前に標準出力に「書き込まれた」データの一部を収集します)。 sys.stdout.flush()
を呼び出すと、強制的にバッファーを「フラッシュ」します。つまり、通常はバッファー内のすべての内容を端末に書き込みます。
バッファリングされていない(非)I/Oに関する有用な情報と、それが役立つ理由を次に示します。
http://en.wikipedia.org/wiki/Data_buffer
バッファ付きIOとバッファなしIO
次の単純なPythonスクリプトを検討してください。
import time
import sys
for i in range(5):
print(i),
#sys.stdout.flush()
time.sleep(1)
これは、5秒間1秒ごとに1つの数字を印刷するように設計されていますが、(デフォルトのシステムバッファリングに応じて)そのまま実行すると、スクリプトが完了するまで出力が表示されず、すぐに0 1 2 3 4
が表示されます画面に印刷されます。
これは、出力がバッファリングされており、各print
の後にsys.stdout
をフラッシュしない限り、出力がすぐに表示されないためです。 sys.stdout.flush()
行からコメントを削除して、違いを確認します。
私の理解では、printステートメントを実行すると、出力がバッファに書き込まれます。そして、バッファーがフラッシュ(クリア)されると、画面に出力が表示されます。デフォルトでは、プログラムの終了時にバッファがフラッシュされます。しかし、WEは、プログラムで "sys.stdout.flush()"ステートメントを使用して手動でバッファをフラッシュすることもできます。以下では、iの値が5に達するとコードバッファーがフラッシュされます。
以下のコードを実行することで理解できます。
chiru @ online:〜$猫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:〜$
*****出力*****
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
chiru @ online:〜$
私の理解では、sys.stdout.flush()は、そのポイントにバッファリングされたすべてのデータをファイルオブジェクトにプッシュします。 stdoutを使用している間、データは端末に書き込まれる前にバッファメモリに保存されます(しばらくの間、またはメモリがいっぱいになるまで)。 flush()を使用すると、バッファが空になる前でも、強制的にバッファを空にして端末に書き込みます。
import sys
for x in range(10000):
print "HAPPY >> %s <<\r" % str(x),
sys.stdout.flush()