我试图从while循环中获取以下输出以显示进度。
- ########
以下是代码,
print ' - #',
x = 1
while x < 15:
print '#',
time.sleep(0.5)
x += 1
但是我只是在while循环完成后打印所有哈希值(?)
任何想法
答案 0 :(得分:4)
import sys
import time
while True:
sys.stdout.write('#')
sys.stdout.flush()
time.sleep(0.5)
答案 1 :(得分:4)
有很多方法可以解决这个问题。
如果您使用的是Python 2.X,则需要在每次打印后调用sys.stdout.flush()
。
如果您正在使用python 3,那么您可以通过执行
来完成它 print(#,sep = ' ', flush=True)
如果使用-u选项运行python,则可以完全禁用缓冲:python -u script.py
如果您直接运行脚本,./script.py
,请在shebang行中指定:#!/usr/bin/env python -u
。
另一种方法是从bash shell中设置env变量PYTHONUNBUFFERED
:
export PYTHONUNBUFFERED="aa"
添加更多详细信息以解决问题:
Python中的Stdout是行缓冲的。这意味着如果您在打印中跳过“,”,则输出将按预期打印。但是当输出打印在同一行时,只有在有新行或缓冲区已满时才会刷新。如果将输出重定向到文件而不是终端(python script.py >output
),则只有在缓冲区已满时才会刷新输出。如果将输出传递给cat,则可以验证这一点:
python script.py | cat
在本答案和其他答案中提到的所有方法中,我们明确地告诉Python不要缓冲,但是一旦得到它就刷新输出。
关于该主题的更多研究:
此行为不是Python特定的。 C中也是printf
的情况。这是由于glibc实现了linux。这种行为背后的原因是效率。因为输出是缓冲的,所以读取和写入操作的数量被最小化。我发现这篇文章给出了相同的简要描述:Unix Buffering Delays
答案 2 :(得分:2)
print
会写入存储在sys.stdout
中的stdout。打印新行时刷新标准输出。由于您不打印新行,因此在您执行之前不会显示文本。但是,您可以自己刷新stdout:
import sys
import time
print ' - #',
sys.stdout.flush()
x = 1
while x < 15:
print '#',
sys.stdout.flush()
time.sleep(0.5)
x += 1
你真的不需要while
循环。 for
循环会更短:
import sys
import time
print ' - #',
sys.stdout.flush()
x = 1
for _ in range(15):
print '#',
sys.stdout.flush()
time.sleep(0.5)
答案 3 :(得分:1)
我想您已经得到了答案但是如果您以后想要覆盖同一行,请在您打印的字符前添加回车\r
(将打字机的托架返回到当前的开头)线,当然;))。我使用它来让我的文件处理脚本写入同一行 - 每个新行都覆盖最后一行。如果新行比前一行短,则需要摆弄额外的空白区域。
EG。制作一个旋转的装载机,它最终会被越来越多的#
s:
import sys
import time
# rotating loader "animation"
# Ubuntu or the aptitude package manager uses something similar
x = 1
symbols = ["|", "/", "-", "\\"]
while x < 20:
x+=1
sys.stdout.write("\r" + symbols[x%len(symbols)])
sys.stdout.flush()
time.sleep(0.2)
# progress bar "animation" using hashtags
x = 1
sys.stdout.write("\r")
while x < 10:
x+=1
sys.stdout.write('#')
sys.stdout.flush()
time.sleep(0.2)
print("")
答案 4 :(得分:0)
看看tqdm。它非常容易为您显示一个好看的进度条。
from tqdm import tqdm
for i in tqdm(range(9)):
...