2013-07-12 3 views
5

私は非常にシンプルなアプリケーション持っている:なぜ私のpython出力がプログラムの最後まで遅れていますか?

import sys 
from time import sleep 

for i in range(3): 
    sys.stdout.write('.') 
    sleep(1) 

print('Welcome!') 

私はそれが表示されるはずその後ドット毎秒(3回)、プリントアウトすることを期待「ようこそ!」。残念ながら、それは単に3秒待ってからすぐにすべてを印刷します。私は通常のPython 2.7を実行しているMac上にいるので、このコードがこのように動作する理由を知ることはできません。助言がありますか?

+0

可能重複(http://stackoverflow.com/questions/107705/ python-output-buffering) – Bruce

+0

詳細については(そしてもっと高度なやり方で)行うためには、[この質問](http://stackoverflow.com/questions/107705/python-output-buffering)を参照してください。 – abarnert

答えて

8

sys.stdoutがバッファされているからです。 flushを使用します。

import sys 
from time import sleep 

for i in range(3): 
    sys.stdout.write('.') 
    sys.stdout.flush() 
    sleep(1) 

print('Welcome!') 
0

あなたはprintまたはloggerを使用する必要があります。

予期した動作が必要な場合は、出力を強制的に行うにはsys.flushを使用する必要があります。

1

stdoutはバッファリングされたストリームです。バッファは、改行文字に達したときに暗黙的にフラッシュされます。

あなたは改行文字を記述することなく、バッファをフラッシュする場合は、別の選択肢sys.stdout.flush()

を呼び出すことによって、そうしなければならない明示的には、バッファリングされていないstderrに書き込むことです。

1

でpythonを呼び出して、stdin、stdout、およびstderrを完全にバッファリングしないようにすることができます。これにより、手動でフラッシュする必要がなくなります。 Unixでは

python -u myscript.py

のようなスクリプトを呼び出すか、あなたはシェバングにそれを置くことができます:[Pythonの出力のバッファリング]の#!/usr/bin/python -u

関連する問題