"time.sleep()" 是否在使用 "end" 属性的打印函数的 for 循环中不起作用?

Does "time.sleep()" not work inside a for loop with a print function using the "end" attribute?

所以,我最近刚开始学习 python 并且正在玩一些代码。我想在一个循环中打印一些没有换行符的字符,但有一些延迟。我在 for 循环中使用了 time.sleep() 函数。但是,它所做的只是延迟输出它在循环中所花费的总时间,一次全部,然后打印出字符。

我确实在没有 "end" 属性的情况下进行了尝试,并且效果很好。但是,我不想换行。

from time import sleep
print("starting the progress bar")


for i in range(50):
    sleep(0.1)
    print("#", end = '')

我希望输出打印一个字符,然后延迟打印另一个字符。但是,脚本延迟 0.1 秒,共 50 次,然后一次打印出所有字符

由于 python 是行缓冲的,它将在打印标准输出之前等待换行符。

解决方案一:

将 PYTHONUNBUFFERED=1 添加到您的 env.var:

export PYTHONUNBUFFERED=1

这将允许立即转储输出

方案二:

因为你正在使用 python 3 你可以使用 flush=True

for i in range(50):
    sleep(0.1)
    print("#", end = '', flush=True)

默认情况下,Python 是行缓冲的。只要您 print 没有换行符,就会收集输出但不会显示。您必须强制 flush 输出。

from time import sleep
print("starting the progress bar")


for i in range(50):
    sleep(0.1)
    print("#", end = '', flush=True)

请注意,无论您使用什么来 查看 输出也可能是行缓冲的。这不能从您的脚本中更改。

我刚刚在 reddit 上找到了解决方案。

reddit comment on why it doesn't work and how beginners fall into the same pitfall

所以,它与缓冲有关。

这是有效的代码;

from time import sleep
print("starting the progress bar")


for i in range(50):
    sleep(0.1)
    print("#", end = '', flush = True)

您可以在 运行 您的程序中使用 -u 选项。

$ man python3


PYTHON(1)                                                            PYTHON(1)

...

       -u     Force  the  stdout  and  stderr  streams to be unbuffered.  This
              option has no effect on the stdin stream.

运行 这样:python3 -u file.py


或者,您可以在 shell

中设置 PYTHONUNBUFFERED 环境变量
       PYTHONUNBUFFERED
              If this is set to a non-empty string it is equivalent to  speci-
              fying the -u option.

像这样:PYTHONUNBUFFERED="yes" python3 file.py


最后,您可以像其他答案提到的那样使用flush=True