2012-04-04 6 views
98

sys.stdout.flush()の機能は何ですか?これは、あなたが可能5秒ごとに1つの番号を印刷するように設計されていますが、それを実行した場合、それが今であるとして(デフォルトのシステム・バッファリングによって異なります)されsys.stdout.flush()メソッドの使用

import time 
import sys 

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

+4

参照:http://stackoverflow.com/questions/230751/how-to-flush-output-of-python-print – nitin

答えて

107

Pythonの標準出力はバッファリングされています(つまり、端末に書き込む前に標準出力に書き込まれたデータの一部を収集します)。 sys.stdout.flush()を呼び出すと、バッファを "フラッシュ"します。つまり、通常はバッファに格納されているすべてのデータを端末に書き込むことになります。

はここ(UN)バッファードI/Oについてのいくつかの良い情報だと、それは便利だ理由:
http://en.wikipedia.org/wiki/Data_buffer
Buffered vs unbuffered IO

+2

これは窓では機能しません!!! –

+0

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

+0

@Ciastopiekarzどうやって考えますか?私がAndrew ClarkのPythonスクリプトを使って、 'sys.stdout.write("%d "%i)'で印刷行を置き換えると、 'sys.stdout.flush()'の呼び出しをコメント解除して、スクリプトが実行されているときに表示するバッファ。 –

71

は、以下のような簡単なPythonスクリプトを考えてみましょうスクリプトが完了するまで出力が表示されず、すぐにすべてが0 1 2 3 4が画面に表示されます。

これは、出力がバッファされているためです。各printの後にsys.stdoutをフラッシュしない限り、すぐに出力が表示されません。差異を確認するには、sys.stdout.flush()行のコメントを削除します。

+20

Python 3.xでは、 'print i'はprint(i、 Python 3のprint()にはデフォルトのプレフィックスend = '\ n'があり、コンソールをフラッシュするように促すので、 –

+0

私はちょうどこの問題を抱えていた!これがなぜそれを解決するのかを明らかにしてくれてありがとう! –

3

私たちが実行し、これまでprint文の出力をバッファリングするために書き込まれます私の理解、あたりとして。バッファがフラッシュ(クリア)されると、出力が画面に表示されます。デフォルトでは、プログラムが終了するとバッファがフラッシュされます。しかし、プログラムで "sys.stdout.flush()"ステートメントを使用することによって、バッファを手動でフラッシュすることもできます。以下のコードでは、iの値が5に達するとバッファがフラッシュされます。

以下のコードを実行することでわかります。

オンライン@チルー:〜$猫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() 

オンライン@チルー:〜$

***** ***** OUTPUT

チルーオンライン@:オンライン@〜$パイソン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 

チルー:〜$

0
import sys 
for x in range(10000): 
    print "HAPPY >> %s <<\r" % str(x), 
    sys.stdout.flush() 
関連する問題