Python 为什么刷新缓冲区中存储的字符很重要?

Python 为什么刷新缓冲区中存储的字符很重要?,python,buffer,newline,flush,Python,Buffer,Newline,Flush,我希望我的python程序在不打印换行符的情况下不断更新下载状态,并发现我可以使用\r\n如下所示 print('Download status: '+str(download), end='\r') 现在我还读到,我还应该包括flush=true ..., end='\r' flush=true) 但我不能确切地理解它的目的。如果我不使用flush,我将来会面临什么问题?我知道它已经有了一个线程,但我真的不知道如何才能使我的代码受益,因为即使没有刷新,它也能正常工作。通常,终端是行缓冲的,

我希望我的python程序在不打印换行符的情况下不断更新下载状态,并发现我可以使用\r\n如下所示

print('Download status: '+str(download), end='\r')
现在我还读到,我还应该包括flush=true

..., end='\r' flush=true)

但我不能确切地理解它的目的。如果我不使用flush,我将来会面临什么问题?我知道它已经有了一个线程,但我真的不知道如何才能使我的代码受益,因为即使没有刷新,它也能正常工作。

通常,终端是行缓冲的,所以如果打印的输出不包含换行符,在发出换行符之前,你不会看到任何东西,或者当程序结束并且作为关闭过程的一部分刷新标准输出时。在这种情况下,您需要将
flush=True
arg添加到
print
调用中。您也可以显式地调用
sys.stdout.flush()
,但是让
print
处理它更方便(也更快)。在Python 2中,您别无选择,只能调用
sys.stdout.flush()

但是,在Python3中,如果输出中有
\r
(回车符),则
print
函数会为您执行缓冲区刷新。所以在这种情况下,你不必担心脸红


OTOH,请注意某些IDE/终端可能不支持此行为,您需要对它们使用
flush=True
sys.stdout.flush()
。因此,一些IDE在使用
\r
end=''
打印时甚至可能无法正常工作,例如,即使您显式地刷新

顺便说一句,这应该是
flush=True
。让
print
转换为字符串和连接更有效:
print('Download status:',Download,end='\r',flush=True)
@PM2Ring谢谢,这是否意味着如果我的终端即使没有flush=True也显示下载状态更新,那么就不需要使用它了?@PM2Ring真棒。请回复您的评论作为答复。我会将此标记为已回答,以便像我这样的未来新手能够轻松理解flush的用途。