回答:
Pythonの標準出力はバッファリングされます(つまり、ターミナルに書き込む前に、標準出力に「書き込まれた」データの一部を収集します)。呼び出しはsys.stdout.flush()
強制的にバッファを「フラッシュ」します。つまり、通常は待機する前であっても、バッファ内のすべてをターミナルに書き込みます。
ここでは(UN)に関するいくつかの良い情報だI / Oとなぜそれが便利ですが、バッファ:
http://en.wikipedia.org/wiki/Data_buffer
バッファバッファなしIO対
sys.stdout.write("%d" % i)
場合、への呼び出しのコメントsys.stdout.flush()
を外して、スクリプトの実行中に表示するバッファーを取得する必要があります。
次の単純な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()
行からコメントを削除して、違いを確認します。
私の理解によると、印刷ステートメントを実行すると、出力は常にバッファに書き込まれます。バッファーがフラッシュ(クリア)されると、画面に出力が表示されます。デフォルトでは、プログラムの終了時にバッファがフラッシュされます。ただし、プログラムで「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
出力を取得するためにの後にカンマがありません