当末尾没有换行符时,为什么打印输出不会立即显示在终端上?
- 2024-12-27 08:47:00
- admin 原创
- 110
问题描述:
我有一个执行模拟的 Python 脚本。每次迭代都需要相当长的时间,而且时间各不相同,因此我.
在每个循环后打印一个,以监控for
脚本运行时的运行速度和语句执行的程度。因此,代码具有以下一般结构:
for step in steps:
run_simulation(step)
# Python 3.x version:
print('.', end='')
# for Python 2.x:
# print '.',
但是,当我运行代码时,点不会逐个出现。相反,循环结束时会同时打印所有点,这使得整个努力毫无意义。如何在代码运行时内联打印点?
当迭代从另一个进程提供的数据并尝试打印结果时(例如回显来自 Electron 应用程序的输入),也可能会出现此问题。请参阅Python 不打印输出。
解决方案 1:
问题
默认情况下,Python 程序的输出会被缓冲以提高性能。终端是独立于代码的程序,存储文本并一次性传达所有文本比单独要求终端程序显示每个符号更有效率。
由于终端程序通常以交互方式使用,输入和输出一次进行一行(例如,用户需要按 Enter 键来指示单个输入项的结束),因此默认设置是一次缓冲一行输出。
因此,如果没有换行符print
,则该print
函数(在 3.x 中;print
在 2.x 中语句)将简单地将文本添加到缓冲区,并且不显示任何内容。
以其他方式输出
有时,有人会尝试直接使用标准输出流来从 Python 程序中输出:
import sys
sys.stdout.write('test')
这会出现同样的问题:如果输出不以换行符结束,它将停留在缓冲区中直到被刷新。
修复问题
对于单个print
我们可以在打印后明确刷新输出。
在 3.x 中,该print
函数有一个flush
关键字参数,允许直接解决问题:
for _ in range(10):
print('.', end=' ', flush=True)
time.sleep(.2) # or other time-consuming work
在 2.x 中,print
语句不提供此功能。相反,使用它的.flush
方法显式刷新流。标准输出流(print
默认情况下,文本在 ed 时进入)由标准库模块提供sys
,名为stdout
。因此,代码将如下所示:
for _ in range(10):
print '.',
sys.stdout.flush()
time.sleep(.2) # or other time-consuming work
对于print
多个
print
可以完全禁用输出线缓冲,而不是每次都刷新(或决定之后需要刷新哪些) 。 有很多方法可以做到这一点,因此请参考链接的问题。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD