print
,默认情况下,在内部打印到sys.stdout
并缓冲要打印的输出。
通常是否由文件确定输出是否被缓冲,但是如果flush
关键字参数为true,则将强制刷新流。
报价sys.stdout
文件,
交互式时,标准流是行缓冲的。否则,它们像常规文本文件一样被块缓冲。
因此,就您而言,您需要像这样显式刷新
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
的文档,
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
由于默认设置end
中断了行缓冲,因此数据将立即发送到stdout
。
重现此问题的另一种方法是将OP给出的实际程序存储在文件中,并使用Python 3.x解释器执行,您将看到stdout
内部在缓冲数据并等待程序完成打印。