为什么 print with end='' 直到换行才出现?

Why does print with end='' doesn't appear until new line?

我一直在用 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...) 打印了整个东西。因此在添加新行(第 3 个点)之前它没有打印任何内容。

不好意思打扰了,我不知道怎么把这些问题弄好

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 正在等待打印所有东西一次以提高效率,但您可以明确告诉它立即刷新您的消息,而无需等待其他打印件。

Python 缓冲输出到标准输出。这是因为一次写入较大的文本片段效率更高(系统调用更少)。

默认情况下,如果 stdout 连接到终端,输出将进行行缓冲。因此打印换行符会刷新缓冲区,您会立即看到输出。 如果 stdout 被重定向到管道或文件中,Python 缓冲会更加积极,并且不会刷新换行符,只有当缓冲区已满时。

为避免此问题,请在休眠前显式刷新缓冲区:

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