为什么在Python中打印时在循环中使用睡眠时不会暂停?

时间:2015-02-26 06:51:09

标签: python python-3.x

此代码:

import time
for i in range(10):
    print(i)
    time.sleep(.5)

使我的电脑挂起5秒钟,然后打印0-9,而不是每半秒打印一个数字。我做错了吗?

2 个答案:

答案 0 :(得分:14)

默认情况下,

print打印到sys.stdout并在内部缓冲要打印的输出。

  

输出是否缓冲通常由文件确定,但如果flush关键字参数为true,则强制刷新流。

     

版本3.3中已更改:添加了flush关键字参数。

引用sys.stdout's documentation

  

交互式时,标准流是行缓冲的。否则,它们像常规文本文件一样进行块缓冲。

因此,在您的情况下,您需要显式刷新,如此

import time
for i in range(10):
    print(i, flush=True)
    time.sleep(.5)

好的,这个缓冲有很多混乱。让我尽可能地解释一下。

首先,如果您在终端中尝试此程序,他们会执行行缓冲(这基本上意味着,每当遇到换行符时,都会将缓冲的数据发送到stdout ), 默认情况下。因此,您可以在Python 2.7中重现此问题,就像这样

>>> import time
>>> for i in range(10):
...     print i,
...     time.sleep(.5)
... 

在Python 3.x中,

>>> for i in range(10):
...     print(i, end='')
...     time.sleep(.5)

我们传递end=''因为默认end值为\n,根据print's documentation

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

由于默认end会破坏线路缓冲,因此数据会立即发送到stdout

重现此问题的另一种方法是将OP给出的实际程序存储在一个文件中并使用Python 3.x解释器执行,您将看到stdout在内部缓冲数据并等待程序完成打印。

答案 1 :(得分:0)

试试这个:

for i in range(10):
        sys.stdout.write('\r' + str(i))
        time.sleep(.5)

这里'/r'是回车符,它将光标再次放在第一位。