我有一个非常简单的应用程序:
import sys
from time import sleep
for i in range(3):
sys.stdout.write('.')
sleep(1)
print('Welcome!')
我希望它每秒打印一个点(3 次),之后它应该显示“欢迎!”。不幸的是,它只是等待三秒钟,然后立即打印出所有内容。我在运行常规 Python 2.7 的 mac 上,我不知道为什么这段代码会这样。有什么建议么?
这是因为sys.stdout
被缓冲了。使用flush
:
import sys
from time import sleep
for i in range(3):
sys.stdout.write('.')
sys.stdout.flush()
sleep(1)
print('Welcome!')
你可以调用 python-u
来使 stdin、stdout 和 stderr 完全无缓冲。这将使您不必手动冲洗它们。
在 Unix 上,调用你的脚本python -u myscript.py
或者你可以把它放在shebang中:#!/usr/bin/python -u
stdout
是一个缓冲流。缓冲区在到达换行符时被隐式刷新。
如果要在不写入换行符的情况下刷新缓冲区,则必须通过调用显式执行此操作sys.stdout.flush()
另一种选择是写入stderr
未缓冲的 。
你应该使用print
or logger
。
如果你想要你期望的行为,你需要使用sys.flush
来强制输出。