狙い
tqdmではhandlerで設定したログのlevelがターミナルの出力に反映されない問題が解決されていないようで,richパッケージを使った方が楽なことが分かった。
tqdmのダメなところ
import logging
from tqdm.contrib.logging import logging_redirect_tqdm
from tqdm.auto import tqdm
logger = logging.Getlogger(logging.DEBUG)
sh = logging.streamHander()
sh.setLevel(logging.WARNING)
with logging_redirect_tqdm(loggers=[logger]):
for i in tqdm(range(5)):
logger.info(i)
上の例だと,sh
はWARNING
以上なので,logger.info(i)
はsh
には渡されないはずだが,表示されてしまう。
richを使う
richHandler
from rich.progress import track
from rich.logging import RichHandler
rh = richHandler()
rh.setLevel(logging.DEBUG)
logger.addHandler(rh)
ネスト無し 単純なfor
for i in track(range(10)):
logger.info(i)
ネスト
from rich.progress import Progress
with Progress() as pb:
t1 = pb.add_task('inner', total=10)
t2 = pb.add_task('outer', total=100)
for i in range(100):
for j in range(10):
logger.info('%s %s', i, j)
pb.update(task_id=t1, completed=j + 1)
pb.update(task_id=t2, completed=i + 1)