在意外鼠标/键盘输入时,tqdm在Windows控制台上崩溃

时间:2018-01-21 21:39:42

标签: python windows tqdm

在Windows上运行任何使用tqdm进度条的应用程序已成为一个令人头痛的问题。

我不清楚这是否是Windows故障,但该错误很容易重现。在 cmd.exe Powershell 上运行以下代码:

from tqdm import *
import time

counter = 1000
for i in tqdm(range(counter)):
     time.sleep(.01)

当进度条增加以触发崩溃时,您可以执行以下操作:

  • 使用鼠标左键按钮在窗口中选择几个字符(即使空格也可以,如下面的屏幕截图所示),然后右键单击或按任意键使应用程序崩溃:

enter image description here

错误消息显示:

Traceback (most recent call last):
  File "tqdmTest.py", line 5, in <module>
    for i in tqdm(range(counter)):
  File "C:\Users\brcod\AppData\Roaming\Python\Python34\site-packages\tqdm\_tqdm.py", line 979, in __iter__
    sp(self.__repr__())
  File "C:\Users\brcod\AppData\Roaming\Python\Python34\site-packages\tqdm\_tqdm.py", line 241, in print_status
    fp_write('\r' + s + (' ' * max(last_len[0] - len_s, 0)))
  File "C:\Users\brcod\AppData\Roaming\Python\Python34\site-packages\tqdm\_tqdm.py", line 234, in fp_write
    fp.write(_unicode(s))
OSError: raw write() returned invalid length 306 (should have been between 0 and 153)

我在 Windows 10 上使用 Python 3.4.4 tqdm 4.19.5

这非常令人讨厌,因为当我只是想点击它来聚焦窗口时,鼠标会在窗口中意外选择几个字符。

任何人都可以澄清为什么会这样吗?这个问题有适当的解决方法吗?

1 个答案:

答案 0 :(得分:1)

解决方案1 ​​:解决此问题的最简单方法是在 cmd.exe 窗口的属性中禁用 QuickEdit模式以防止鼠标点击意外选择并粘贴文字:

解决方案2 :这也可以通过编程方式处理。只需重写循环以捕获异常,并在发生异常时pass

from tqdm import *
import time

maxCount = 1000
pbar = tqdm(total = maxCount)

for i in range(maxCount+1):
     try:
          pbar.update(i - pbar.n)
     except OSError as e:
          pass

     time.sleep(.01)

pbar.close()