我的代码的snipet看起来像这样:
print(' ⦾ Loading subcase decryption table...', end='')
codes_dict = load_codes(codes_file)
print('\r ✓ Subcase decryption table loaded.')
这样做的目的是将一条消息显示为反馈某些内容正在运行(以及如此):
>> ⦾ Loading subcase decryption table...
一旦完成,就必须替换(在同一条线上):
>> ✓ Subcase decryption table loaded.
但这不起作用。相反,第一个print语句必须以'\r'
中的返回字符print('\r ⦾ Loading subcase decryption table...', end='')
开头,但我只是不明白为什么......
如果它像这样循环,那将是完全合理的:
for i in range(76):
print('\r {:7.2%}'.format((i + 1) / 76), end='')
有人可以向我解释一下吗?
答案 0 :(得分:2)
原因(最有可能)是你的shell是line buffered。发送给它的任何文本都会缓冲到一定长度或直到遇到\r
。这样做的原因是,如果程序写出单个字符,将渲染内容推迟到最新但用户方便的时刻,则可以最大限度地减少开销。
对交互设备使用行缓冲意味着输出 以换行符结尾的邮件会立即显示 - 通常是这样 你想要什么。不以换行符结尾的输出可能会也可能不会 立即显示,所以如果你想让它们立刻出现,你 应该使用fflush
显式刷新缓冲输出
线路缓冲是你的第一条线永远不会出现的原因;如果您在行前加\r
,则可以有效地刷新行缓冲区。
解决方案通常是直接写入底层流或强制缓冲区刷新。