为什么刷新存储在缓冲区中的字符很重要?
Why is it important to flush characters stored in buffer?
我希望我的 python 程序在不打印换行符的情况下不断更新下载状态,发现我可以按如下方式使用 \r。
print('Download status: '+str(download), end='\r')
现在我还读到我还应该包括 flush = true
..., end='\r' flush=true)
但我看不出它的确切用途。不使用flush以后会面临什么问题?我知道已经有一个关于它的线程,但我无法真正思考如何使我的代码受益,因为即使没有刷新它也能正常工作。
通常,终端是行缓冲的,所以如果 print
的输出不包含换行符,在换行符 被 发出之前,您将看不到任何内容,或者当程序结束并且 stdout
作为关闭过程的一部分被刷新时。在这种情况下,您需要将 flush=True
arg 添加到 print
调用中。您也可以显式调用 sys.stdout.flush()
,但让 print
处理它更方便(也稍微快一些)。在 Python 2 中,您别无选择,只能调用 sys.stdout.flush()
.
但是,在 Python 3 中,如果输出中有 \r
(回车 return),print
函数会为您执行缓冲区刷新。所以在那种情况下,你不需要担心冲洗。
OTOH,请注意某些 IDE/终端可能不支持此行为,您需要对它们使用 flush=True
或 sys.stdout.flush()
。就此而言,某些 IDE 在使用 \r
和 end=''
打印时甚至可能无法正确运行,即使您明确地进行了刷新,例如 Spyder。
我希望我的 python 程序在不打印换行符的情况下不断更新下载状态,发现我可以按如下方式使用 \r。
print('Download status: '+str(download), end='\r')
现在我还读到我还应该包括 flush = true
..., end='\r' flush=true)
但我看不出它的确切用途。不使用flush以后会面临什么问题?我知道已经有一个关于它的线程,但我无法真正思考如何使我的代码受益,因为即使没有刷新它也能正常工作。
通常,终端是行缓冲的,所以如果 print
的输出不包含换行符,在换行符 被 发出之前,您将看不到任何内容,或者当程序结束并且 stdout
作为关闭过程的一部分被刷新时。在这种情况下,您需要将 flush=True
arg 添加到 print
调用中。您也可以显式调用 sys.stdout.flush()
,但让 print
处理它更方便(也稍微快一些)。在 Python 2 中,您别无选择,只能调用 sys.stdout.flush()
.
但是,在 Python 3 中,如果输出中有 \r
(回车 return),print
函数会为您执行缓冲区刷新。所以在那种情况下,你不需要担心冲洗。
OTOH,请注意某些 IDE/终端可能不支持此行为,您需要对它们使用 flush=True
或 sys.stdout.flush()
。就此而言,某些 IDE 在使用 \r
和 end=''
打印时甚至可能无法正确运行,即使您明确地进行了刷新,例如 Spyder。