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通过每个数字附加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)

输出是我所期望01234的,没有\n's,但时间出乎意料。该过程不是在暂停一秒钟后显示每个数字,而是等待四秒钟,然后显示所有五个数字。

为什么它的print('string')行为与print('string', end='')while 循环不同?有没有办法一次显示没有换行符的字符?我试过sys.stdout.write(str(x))了,但它的行为方式与print(end='').

4

2 回答 2

19

因为输出流是行缓冲的——因为它没有在打印语句之间显式刷新,所以它会一直等到看到换行符来刷新输出。

您可以通过 强制冲洗sys.stdout.flush()

或者,如果您使用该-u标志运行 Python,它将禁用行缓冲。

于 2012-12-26T23:04:53.877 回答
7

这只是 python 缓冲标准输出。这个答案有更多信息。

你可以这样冲洗它:

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)

或者启动python python -u,它不会被缓冲。

于 2012-12-26T23:08:18.540 回答