我正在尝试为流程制作进度条,但为了简短起见,请考虑以下代码段:
import sys
import time
for i in range(10):
time.sleep(0.5)
sys.stdout.write('*')
sys.stdout.write('\n')
我期待它做的是在同一行上每半秒打印一颗星(这正是我使用像Sublime Text这样的IDE运行代码时的功能)。但是,当我在Mac OS终端中运行它时,它只等待5秒钟,然后立即打印整个字符串**********
。
为什么会发生这种情况以及如何获得理想的行为?
答案 0 :(得分:3)
这样做是因为输出是缓冲的。试试这个:
import sys
import time
for i in range(10):
time.sleep(0.5)
sys.stdout.write('*')
sys.stdout.flush() # <-- this is the key
sys.stdout.write('\n')
每次写入时都会刷新输出,sys.stdout
不会等到下一个换行符;相反,它会立即写入缓冲区中的任何字符。
答案 1 :(得分:3)
输出正在缓冲,因此您需要在每次写入操作后调用sys.stdout.flush()
来刷新缓冲区。
或者,更好的是,只需使用print
并让Python为您完成。在3.3+版本中,代码为:
import time
for i in range(10):
time.sleep(0.5)
print('*', end='', flush=True)
print()
如果您使用的是旧版本,则会省略flush=True
:
import time
for i in range(10):
time.sleep(0.5)
print('*', end='')
print()
如果你碰巧使用Python 2.x,你还需要写:
from __future__ import print_function
在代码顶部使用Python 3.x print
。有关详细信息,请参阅文档中的__future__
— Future statement definitions。