"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
。
所以,我最近刚开始学习 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
。