Как правильно перенаправить стандартный вывод, журналирование и tqdm в виджет PyQtPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно перенаправить стандартный вывод, журналирование и tqdm в виджет PyQt

Сообщение Anonymous »

TL;DR
Ответы см.:
  • мой изначально принятый ответ в 2019 году с использованием редактирования текста и перенаправления потоков stdout/stderr, см. https://stackoverflow.com/a/55082521/7237062
  • мой второй ответ, теперь помечен как принятый: производный и улучшенный подход с настоящим QProgressBar! https://stackoverflow.com/a/74091829/7237062
ВОПРОС
Прежде всего, я знаю что многие вопросы похожи на этот.
Но, потратив на это так много времени, теперь я обращаюсь за помощью к сообществу.
Я разработал и использую кучу модулей Python, использующих tqdm.
Я хочу, чтобы их можно было использовать внутри Jupyter, в консоли или с графическим интерфейсом.
Все работает нормально в Jupyter или консоли: между журналированием нет конфликтов /prints и индикаторы выполнения tqdm. Вот пример кода, показывающий поведение консоли/Jupyter:
# coding=utf-8
from tqdm.auto import tqdm
import time
import logging
import sys
import datetime
__is_setup_done = False

def setup_logging(log_prefix):
global __is_setup_done

if __is_setup_done:
pass
else:
__log_file_name = "{}-{}_log_file.txt".format(log_prefix,
datetime.datetime.utcnow().isoformat().replace(":", "-"))

__log_format = '%(asctime)s - %(name)-30s - %(levelname)s - %(message)s'
__console_date_format = '%Y-%m-%d %H:%M:%S'
__file_date_format = '%Y-%m-%d %H-%M-%S'

root = logging.getLogger()
root.setLevel(logging.DEBUG)

console_formatter = logging.Formatter(__log_format, __console_date_format)

file_formatter = logging.Formatter(__log_format, __file_date_format)
file_handler = logging.FileHandler(__log_file_name, mode='a', delay=True)
# file_handler = TqdmLoggingHandler2(__log_file_name, mode='a', delay=True)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(file_formatter)
root.addHandler(file_handler)

tqdm_handler = TqdmLoggingHandler()
tqdm_handler.setLevel(logging.DEBUG)
tqdm_handler.setFormatter(console_formatter)
root.addHandler(tqdm_handler)

__is_setup_done = True

class TqdmLoggingHandler(logging.StreamHandler):

def __init__(self, level=logging.NOTSET):
logging.StreamHandler.__init__(self)

def emit(self, record):
msg = self.format(record)
tqdm.write(msg)
# from https://stackoverflow.com/questions/385 ... 4#38739634
self.flush()

def example_long_procedure():
setup_logging('long_procedure')
__logger = logging.getLogger('long_procedure')
__logger.setLevel(logging.DEBUG)
for i in tqdm(range(10), unit_scale=True, dynamic_ncols=True, file=sys.stdout):
time.sleep(.1)
__logger.info('foo {}'.format(i))

example_long_procedure()

Полученный результат:
2019-03-07 22:22:27 - long_procedure - INFO - foo 0
2019-03-07 22:22:27 - long_procedure - INFO - foo 1
2019-03-07 22:22:27 - long_procedure - INFO - foo 2
2019-03-07 22:22:27 - long_procedure - INFO - foo 3
2019-03-07 22:22:27 - long_procedure - INFO - foo 4
2019-03-07 22:22:28 - long_procedure - INFO - foo 5
2019-03-07 22:22:28 - long_procedure - INFO - foo 6
2019-03-07 22:22:28 - long_procedure - INFO - foo 7
2019-03-07 22:22:28 - long_procedure - INFO - foo 8
2019-03-07 22:22:28 - long_procedure - INFO - foo 9
100%|¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦| 10.0/10.0 [00:01 Console text queue reception Started

Подробнее здесь: https://stackoverflow.com/questions/550 ... yqt-widget
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»