Измените функцию журналирования «print» на «tqdm.write», чтобы регистрация не влияла на индикаторы выполнения

У меня простой вопрос: как мне изменить встроенный регистратор Pythonprint функция кtqdm.write так, чтобы сообщения регистрации не мешали индикаторам выполнения tqdm? Спасибо!

 aviso12 нояб. 2018 г., 21:35
Если вам нужно придерживаться tqdm, то ответ @ RolKau - это то, что нужно, но tqdm очищает и перерисовывает все индикаторы выполнения при каждой записи, поэтому легко перегрузить его, если у вас много выходных данных. Если вы не сосете с TQDM,просветить делает то, что вам нужно, из коробки и лучше выдерживает нагрузку, поскольку не требует перерисовки.

Ответы на вопрос(1)

Решение Вопроса

Вам нужен собственный обработчик регистрации:

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 (KeyboardInterrupt, SystemExit):
            raise
        except:
            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)

Редактировать: Исправлена ​​ошибка в вызове метода init супер TqdmLoggingHandler, на которую указывал старательный читатель @BlaineRogers в комментариях. (Если кто-то хочет прочитать об этой темной области Python дальше, я рекомендуюhttps://fuhm.net/super-harmful/)

 Alexander McFarlane13 февр. 2017 г., 16:28
важно использоватьimport tqdm неfrom tqdm import tqdm иначе IO прервет индикатор выполнения
 Guillochon03 авг. 2016 г., 11:37
Отлично! Спасибо!
 ddofborg21 дек. 2016 г., 12:42
Мне нужно что-то, чтобы использовать модуль логирования для вывода, решил это так:stackoverflow.com/a/41224909/638504, Вывод такой:2016-12-19 15:35:06 [INFO ] 16%|#####9 | 768/4928 [07:04<40:50, 1.70it/s]
 RolKau11 февр. 2019 г., 18:51
@BlaineRogers Вы абсолютно правы! Спасибо за указание на это. Должно быть, я написал это до того, как познакомился с MRO. Я исправлю ответ, если кто-то захочет использовать код.
 Blaine Rogers07 февр. 2019 г., 16:02
super(self.__class__, self).__init__(level) вызоветRecursionError если вы когда-нибудь попытаетесь создать экземпляр подклассаTqdmLoggingHandler. super(cls, self).__init__() вызывает__init__ метод класса послеcls в порядке разрешения методаself.__class__, ПозволятьMyTqdmLoggingHandler быть подклассомTqdmLoggingHandler, затемMyTqdmLoggingHandler() звонкиTqdmLoggingHandler.__init__(self), который вызываетsuper(MyTqdmLoggingHandler, self).__init__(), который вызываетTqdmLoggingHandler.__init__(self).

Ваш ответ на вопрос