为什么使用end=''的print函数不会出现直到换行?

6

我一直在用 Python 3.9 编写程序,现在有这样一段代码:

#Print 3 dots at the interval shown
def dots(t):
    t *= 3
    sleep(t)
    print('.', end='')
    sleep(t)
    print('.', end='')
    sleep(t)
    print('.')

将其称为:

# These are completely aesthetic
sleep(0.25)
print("Defining Functions", end='')
dots(0.4)

我期望程序打印 Defining Functions 并且在1.2秒内连续输出3个带点的 .。实际上会等待 3.85 秒后打印完整的字符串加上点号 (Defining Functions...),因此它没有打印任何内容直到新行添加(第三个点)。

如果有不清楚的地方,抱歉我不知道如何更好地提问。

2个回答

11

Python会将输出缓冲到标准输出(stdout)。这是因为一次性写入更多的文本,效率更高(系统调用更少)。

默认情况下,如果stdout连接到终端,那么输出将是行缓冲的。这样打印换行符会刷新缓冲区并立即看到输出结果。 如果stdout被重定向到管道或文件,则Python会更积极地进行缓冲,并且仅在缓冲区已满时才会刷新,而不是在换行符处刷新。

为了避免这个问题,在休眠之前显式刷新缓冲区:

 print('.', end='', flush=True)

2

flush=True传递给print

def dots(t):
    t *= 3
    sleep(t)
    print('.', end='', flush=True)
    sleep(t)
    print('.', end='', flush=True)
    sleep(t)
    print('.', flush=True)

sleep(0.25)
print("Defining Functions", end='', flush=True)
dots(0.4)

你可能会问为什么print表现出这样的行为,对于大多数编程语言来说,打印东西并不是一件非常快速和直接的事情,Python为了更高效地打印信息,通常会等待将所有信息一次性打印出来,但你可以明确告诉它立即刷新消息,而不必等待其他打印。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接