为什么在while循环中,包含'end='参数的Python打印语句会表现出不同的行为?

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,每个数字后面都有一个换行符。此外,每个数字在等待一秒后才显示。
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,但时间顺序却出乎意料。进程不是每隔一秒就显示一个数字,而是等待四秒,然后显示所有五个数字。
为什么在while循环中print('string')的行为与print('string', end='')不同?有没有办法每秒显示一个字符而不带换行符?我尝试过sys.stdout.write(str(x)),但它的表现和print(end='')一样。
2个回答

19
因为输出流是按行缓冲的,因此在打印语句之间没有显式刷新之前,它会等待看到换行符才会刷新输出。
你可以通过 sys.stdout.flush() 强制刷新。
或者如果你使用带有 -u 标志的 Python 运行程序,它会禁用行缓冲。

1
在Python 3.5中,print(x, end='', flush=True)也可以工作。 - evan54

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)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接