25

簡単な質問があります: 組み込みの Python ロガーのprint機能を変更しtqdm.writeて、ログ メッセージが tqdm の進行状況バーに干渉しないようにするにはどうすればよいですか? ありがとう!

4

5 に答える 5

42

カスタム ロギング ハンドラが必要です。

import logging
import tqdm

class TqdmLoggingHandler(logging.Handler):
    def __init__(self, level=logging.NOTSET):
        super().__init__(level)

    def emit(self, record):
        try:
            msg = self.format(record)
            tqdm.tqdm.write(msg)
            self.flush()
        except Exception:
            self.handleError(record)  

次に、これをログ チェーンに追加します。

import time

log = logging.getLogger(__name__)
log.setLevel(logging.INFO)
log.addHandler(TqdmLoggingHandler())
for i in tqdm.tqdm(range(100)):
    if i == 50:
        log.info("Half-way there!")
    time.sleep(0.1)

編集:コメントで勤勉な読者@BlaineRogersによって指摘された、スーパーTqdmLoggingHandlerのinitメソッドへの呼び出しのバグを修正しました。(Python のこの曖昧な領域についてさらに読みたい場合は、https://fuhm.net/super-harmful/をお勧めします)

于 2016-08-03T09:28:06.213 に答える
2

最も簡単な方法は、オブジェクトのストリームを変更することですStreamHandler。例:

import logging
from tqdm import tqdm, trange
import time

log = logging.getLogger(__name__)
log.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setStream(tqdm) # <-- important
handler = log.addHandler(handler)

for i in trange(100):
    if i == 50:
        log.info("Half-way there!")
    time.sleep(0.1)
于 2021-04-01T14:09:57.123 に答える