スポンサーリンク

clear_output()するとtqdmプログレスバーが表示されなくなる問題を解決する【jupyter】

Python

Jupyter Lab/Notebookでoutputの定期的に表示を更新するには、clear_output()を使って以下のように書く。このコードに対して、tqdmでプログレスバーを表示させたい場合に発生する問題と解決方法について記載する。

from IPython import display
from time import sleep

for i in range(100):
    print(i)
    display.clear_output(wait=True)
    sleep(1) # 表示速度調整のために1s止める

# 99 ※0から順番に99まで表示される。

tqdmを使ってプログレスバーを表示させたい場合の問題

先ほどのコードに対して、プログラムの進み具合を確認するために、tqdmを使ってプログレスバーを表示させようとしてもclear_output()しているため、プログレスバーも消されてしまう。このため、プログラムの進み具合を確認することができない。

from tqdm.notebook import tqdm

for i in tqdm(range(100)):
    print(i)
    display.clear_output(wait=True)
    sleep(1) # 速度調整のために1s止める

# 99 ※tqdmも消されてしまうため、0から順番に99まで表示されだけ

解決方法

ipywidgetsのOutputを使うことで、clear_output()によって消す出力を選択することができます。

例えば、print(i)のみ消したい場合は、以下のように書く。

from ipywidgets import Output

out = Output()
display.display(out)
for i in tqdm(range(100)):
    with out:
        print(i)
        display.clear_output(wait=True)
    sleep(1) # 速度調整のために1s止める

matplotlibやseabornを使って図表を出力に表示させている場合も同様の方法で対処できる。

関連記事、参考資料

コメント