1

プログレス バーを使用するアプリケーションを Windows で実行することはtqdm、大きな頭痛の種です。

これが Windows の障害かどうかはわかりませんが、バグは簡単に再現できます。cmd.exeまたはPowershellで次のコードを実行します。

from tqdm import *
import time

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

進行状況バーが増加してクラッシュをトリガーしている間に、次の操作を実行できます。

  • マウスの左ボタンを使用して、ウィンドウ上のいくつかの文字を選択し (下のスクリーンショットが示すように、空白でも可能です)、右クリックするか、任意のキーを押して、アプリケーションをクラッシュさせます。

ここに画像の説明を入力

エラーメッセージには次のように記載されています。

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 10tqdm 4.19.5でPython 3.4.4を使用しています。

ウィンドウにフォーカスを当てるためにマウスをクリックしようとしているときに、マウスがウィンドウ内のいくつかの文字を誤って選択してしまうため、これは非常に面倒です。

なぜこれが起こるのか誰でも明確にできますか?この問題の適切な回避策はありますか?

4

1 に答える 1

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()
于 2018-01-22T03:12:52.333 に答える