使用tqdm时cmd和idle之间有什么区别?

时间:2016-03-09 15:30:59

标签: python-3.x cmd windows-7 python-idle tqdm

最近我想在我的脚本中添加一个简单的进度条,我使用tqdm,但令我感到困惑的是,当我在IDLE或cmd中时,输出是不同的

例如这个

from tqdm import tqdm
import time

def test():
    for i in tqdm( range(100) ):
        time.sleep(0.1)

在cmd中给出预期的输出

30%|███       | 30/100 [00:03<00:07,  9.14it/s]

但在IDLE中输出就像这样

  0%|          | 0/100 [00:00<?, ?it/s]
  1%|1         | 1/100 [00:00<00:10,  9.14it/s]
  2%|2         | 2/100 [00:00<00:11,  8.77it/s]
  3%|3         | 3/100 [00:00<00:11,  8.52it/s]
  4%|4         | 4/100 [00:00<00:11,  8.36it/s]
  5%|5         | 5/100 [00:00<00:11,  8.25it/s]
  6%|6         | 6/100 [00:00<00:11,  8.17it/s]
  7%|7         | 7/100 [00:00<00:11,  8.12it/s]
  8%|8         | 8/100 [00:00<00:11,  8.08it/s]
  9%|9         | 9/100 [00:01<00:11,  8.06it/s]
 10%|#         | 10/100 [00:01<00:11,  8.04it/s]
 11%|#1        | 11/100 [00:01<00:11,  8.03it/s]
 12%|#2        | 12/100 [00:01<00:10,  8.02it/s]
 13%|#3        | 13/100 [00:01<00:10,  8.01it/s]
 14%|#4        | 14/100 [00:01<00:10,  8.01it/s]
 15%|#5        | 15/100 [00:01<00:10,  8.01it/s]
 16%|#6        | 16/100 [00:01<00:10,  8.00it/s]
 17%|#7        | 17/100 [00:02<00:10,  8.00it/s]
 18%|#8        | 18/100 [00:02<00:10,  8.00it/s]
 19%|#9        | 19/100 [00:02<00:10,  8.00it/s]
 20%|##        | 20/100 [00:02<00:09,  8.00it/s]
 21%|##1       | 21/100 [00:02<00:09,  8.00it/s]
 22%|##2       | 22/100 [00:02<00:09,  8.00it/s]
 23%|##3       | 23/100 [00:02<00:09,  8.00it/s]
 24%|##4       | 24/100 [00:02<00:09,  8.00it/s]
 25%|##5       | 25/100 [00:03<00:09,  8.00it/s]
 26%|##6       | 26/100 [00:03<00:09,  8.00it/s]
 27%|##7       | 27/100 [00:03<00:09,  8.09it/s]
 28%|##8       | 28/100 [00:03<00:09,  7.77it/s]
 29%|##9       | 29/100 [00:03<00:09,  7.84it/s]
 30%|###       | 30/100 [00:03<00:08,  7.89it/s]
 31%|###1      | 31/100 [00:03<00:08,  7.92it/s]
 32%|###2      | 32/100 [00:03<00:08,  7.94it/s]
 33%|###3      | 33/100 [00:04<00:08,  7.96it/s]
 34%|###4      | 34/100 [00:04<00:08,  7.97it/s]
 35%|###5      | 35/100 [00:04<00:08,  7.98it/s]
 36%|###6      | 36/100 [00:04<00:08,  7.99it/s]
 37%|###7      | 37/100 [00:04<00:07,  7.99it/s]
 38%|###8      | 38/100 [00:04<00:07,  7.99it/s]
 39%|###9      | 39/100 [00:04<00:07,  8.00it/s]
 40%|####      | 40/100 [00:04<00:07,  8.00it/s]
 41%|####1     | 41/100 [00:05<00:07,  8.00it/s]

如果我像

那样创建自己的进度条,我也会得到相同的结果
import sys

def progress_bar_cmd(count,total,suffix="",*,bar_len=60,file=sys.stdout):
    filled_len = round(bar_len*count/total)
    percents   = round(100*count/total,2)
    bar        = "#"*filled_len + "-"*(bar_len - filled_len)
    file.write( "[%s] %s%s ...%s\r"%(bar,percents,"%",suffix))
    file.flush()

for i in range(101):
    time.sleep(1)
    progress_bar_cmd(i,100,"range 100") 

为什么会这样?

并且有办法解决它???

1 个答案:

答案 0 :(得分:2)

将自己限制为ascii字符,第二个代码的程序输出在两种情况下都是相同的 - 表示ascii字符的ascii字节流。语言定义不能也不能指定输出设备或显示程序对字节的作用,特别是控制字符如'\ r'。

Windows命令提示符控制台至少有时会将'\ r'解释为'将光标返回到当前行的开头而不删除任何内容'。 在Win10控制台中:

>>> import sys; out=sys.stdout
>>> out.write('abc\rdef')
def7

但是,当我运行你的第二个代码时,添加了缺少的时间导入,我没有看到覆盖行为,但是看到与IDLE一样的连续行输出。

C:\Users\Terry>python f:/python/mypy/tem.py
[------------------------------------------------------------] 0.0% ...range 100[#-----------------------------------------------------------] ...

第三方面,如果缩短写入file.write("[%s]\r"% bar),那么我确实看到一个输出被覆盖一遍又一遍。

IDLE使用的tk Text小部件仅解释\ t和\ n,但不解释其他控制字符。对于我们中的一些人来说,这似乎适用于开发环境,在这种情况下,擦除字符不如生产环境中那么合适。