6

MacOSXでpythonバージョン2.7.3を実行しています。

次のコード ブロックを検討してください。

from __future__ import print_function
import time
x = 0
while x < 5:
    print(x)
    x += 1
    time.sleep(1)

このスクリプトを実行すると、期待どおりの出力が得られます。各数値0に文字が追加された数値です。さらに、各数字は 1 秒の一時停止後に表示されます。4\n

0
1
2
3
4

次のコード ブロックを考えてみましょう。

from __future__ import print_function
import time
x = 0
while x < 5:
    print(x, end='')
    x += 1
    time.sleep(1)

出力は's01234なしで期待どおりですが、タイミングは予想外です。このプロセスは、1 秒間の休止の後に各桁を表示するのではなく、4 秒間待ってから 5 つの数字すべてを表示します。\n

while ループとはprint('string')異なる動作をするのはなぜですか? print('string', end='')一度に1秒ずつ、改行なしで文字を表示する方法はありますか? を試してみsys.stdout.write(str(x))ましたが、 と同じように動作しprint(end='')ます。

4

2 に答える 2

19

出力ストリームは行バッファリングされているため、print ステートメント間で明示的にフラッシュされていないため、改行が出力をフラッシュするまで待機します。

経由でフラッシュを強制できますsys.stdout.flush()

-uまたは、フラグを指定して Python を実行すると、ライン バッファリングが無効になります。

于 2012-12-26T23:04:53.877 に答える
7

これは単なる python バッファリング stdout です。この回答には、さらに詳しい情報があります。

次のようにフラッシュできます。

import sys
from __future__ import print_function
import time
x = 0
while x < 5:
    print(x, end='')
    x += 1
    sys.stdout.flush()
    time.sleep(1)

または、 pythonpython -uを起動すると、バッファリングされません。

于 2012-12-26T23:08:18.540 に答える