Вложенный tqdm, pretty print
Как сделать так, чтобы K уровней tqdm-ов выписывалось ровно в K строчек? Пример:
from tqdm import tqdm from time import sleep for _ in tqdm(range(5), "All", ncols=80, position=0): for _ in tqdm(range(100), "Sub", ncols=80, position=1, leave=False): sleep(0.01)

Выводит: А ожидаю только 2 строчки All и Sub . Перепробовал разные комбинации параметров. Иногда в песочнице в браузере работает, а на винде локально — нет. Модуль colorama не помог тоже.
Отслеживать
задан 16 дек 2020 в 15:40
23 3 3 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Короче PyCharm-овский терминал на винде не поддерживает такое. Чтобы получить правильный вывод, надо поставить «Emulate terminal in output console» флажок или ждать, когда добавят поддержку. С этим флажком достаточно только leave=False во втором поставить.
Отслеживать
ответ дан 16 дек 2020 в 16:11
23 3 3 бронзовых знака
from tqdm.auto import tqdm from time import sleep for _ in tqdm(range(5), "All", position=0): for _ in tqdm(range(100), "Sub", position=1, leave=False): sleep(0.01)
Т.е. во-первых используйте tqdm.auto , он лучше определяет как оптимально общаться с конкретно вашим типом устройства вывода. И во-вторых уберите параметр ncols , он может мешать нормальному позиционированию элементов прогресс-бара.
Отслеживание времени работы на языке python

Индикаторы для определения степени выполнения работы скрипта или отдельной функции можно выделить в класс, который называется Progress Bar.
Progress Bar реализованы практически во всех языках программирования, но на Python-е внедрить такой индикатор максимально просто.
Наиболее распространённые модули называются: tqdm, progress и alive-progress.
Для примера выполнения каких-либо действий мы будем использовать модуль time, и показывать циклом отсчитывание секунд.
Для начала подключим модуль progress и time. После этого реализуем простой отчет до 10. Так как мы будем работать в командной строке, то используем компонент IncrementalBar модуля progress, который нам позволит отчитывать действия. Ниже представлен простой код и визуализация работы.
import time from progress.bar import IncrementalBar bar = IncrementalBar(`Countdown`, max = 10) for i in range(10): bar.next() time.sleep(1) bar.finish()
В итоге, при работе скрипта вы видим следующее:

Алгоритм предельно прост: сначала создаем переменную, в которой указываем имя Progress Bar-а и максимальное значение, а потом каждый раз увеличиваем ее методом next() на одно значение. В конце, для получения конечной информации о работе указываем метод finish().
При этом модуль progress содержит не только IncrementalBar, но и более 15 различных вариантов визуализации.
При использовании модуля tqdm нам надо его только добавить и использовать как один из параметров цикла. При этом данный модуль имеет больше опций чем progress, доступен для использования в jupyter notebook, а также достаточно информативен.
import time from tqdm import tqdm for i in tqdm(range(10)): time.sleep(1)
Результат работы при этом следующий:

Как можно заметить, даже без каких-либо настроек tqdm показывает нам время выполнения и за сколько выполняется один цикл (что очень удобно).
Последним вариантом реализации Progress Bar, который мы рассмотрим, будет модуль alive-progress.
В самом простом исполнении он похож на tqdm, но отображает чуть больше анимации в консоли.
Для его работы надо не только использовать модуль alive_progress, но и конструкцию with as (этот вариант наиболее простой, но не обязательный). Кроме этого, во время каждой итерации цикла нам надо вызывать bar(), чтобы увеличить значение progress bar.
import time from alive_bar(10) as bar: for I in range(10): bar() time.sleep(1)
Видим, что информации стало еще больше

Данные модули имеют крайне большое и разнообразное количество функций, которые позволяют сделать работу в консоли более информативной и понятной для пользователя. А также дать нам информацию о том, как быстро работает программа, сколько еще отработать осталось, и не завис ли скрипт.
Создание текстового прогресс-бара в консоли
Часто возникает ситуация, когда при разработке консольных приложений, таких как приложения для загрузки или выгрузки файлов, требуется визуализировать процесс выполнения задачи. Это может быть полезно для предоставления обратной связи пользователю о том, как долго еще будет выполняться задача, а также для отслеживания прогресса выполнения задачи во время отладки.
Предположим, что есть задача загрузки большого файла с FTP-сервера. Было бы удобно иметь визуальное представление о том, сколько уже загружено и сколько осталось загрузить.
Однако, при этом хотелось бы избежать стирания всего текста, который был напечатан в консоли в предыдущих строках. То есть, не хотелось бы «очищать» всю консоль при печати обновленного прогресса.
Как это можно сделать?
В Python для создания текстового прогресс-бара можно использовать модуль tqdm . Этот модуль предоставляет простой и удобный способ отображения прогресс-бара в консоли.
from tqdm import tqdm import time for i in tqdm(range(100)): time.sleep(0.01) # имитация задержки
В этом примере tqdm(range(100)) создает итератор, который выводит прогресс-бар в консоли при каждой итерации цикла. Функция time.sleep(0.01) используется для имитации задержки, чтобы можно было увидеть прогресс-бар в действии.
Как это работает?
Модуль tqdm использует специальные символы для перемещения курсора влево, так что при каждой итерации он перезаписывает текущую строку, создавая эффект движения прогресс-бара. При этом все предыдущие строки остаются нетронутыми.
Таким образом, модуль tqdm предоставляет простой и удобный способ добавления текстового прогресс-бара в консольное приложение на Python, не требуя при этом «очистки» всей консоли.
Отслеживаем прогресс выполнения в Python
Индикаторы прогресса (progress bar) — визуальное отображение процесса работы. Они избавляют нас от необходимости беспокоиться о том, не завис ли скрипт, дают интуитивное представление о скорости его выполнения и подсказывают, сколько времени осталось до завершения.
Человек ранее не использовавший индикаторы прогресса может предположить, что их внедрение может сильно усложнить код. К счастью, это не так. Небольшие примеры ниже покажут, как быстро и просто начать отслеживать прогресс в консоли или в интерфейсе быстро набирающей популярность графической библиотеки PySimpleGUI.
Используем Progress
Первым у нас идёт модуль Progress.
Всё, что от вас потребуется, это указать количество ожидаемых итераций, тип индикатора и вызывать функцию при каждой итерации:
import time from progress.bar import IncrementalBar mylist = [1,2,3,4,5,6,7,8] bar = IncrementalBar('Countdown', max = len(mylist)) for item in mylist: bar.next() time.sleep(1) bar.finish()
Есть индикаторы на любой вкус:
Используем tqdm
Следующей на очереди идёт библиотека tqdm.
Быстрый и расширяемый индикатор прогресса для Python и CLI
Всего один вызов функции понадобится для получения результата аналогичного предыдущему:
import time from tqdm import tqdm mylist = [1,2,3,4,5,6,7,8] for i in tqdm(mylist): time.sleep(1)
Само собой, в комплекте идёт куча настроек и опций.
Используем alive-progress
Ещё один вариант синтаксиса, побольше дефолтных анимаций, чем в предыдущих примерах:
from alive_progress import alive_bar import time mylist = [1,2,3,4,5,6,7,8] with alive_bar(len(mylist)) as bar: for i in mylist: bar() time.sleep(1)
GUI индикатор прогресса для скрипта
Иногда возникает необходимость предоставить конечному пользователю графический индикатор.
Сколько кода нужно, чтобы достигнуть такого результата? Немного:
import PySimpleGUI as sg import time mylist = [1,2,3,4,5,6,7,8] for i, item in enumerate(mylist): sg.one_line_progress_meter('This is my progress meter!', i+1, len(mylist), '-key-') time.sleep(1)
Индикатор в приложении PySimpleGUI
Рассмотрим реализацию индикатора в PySimpleGUI.
Вот как это сделать:
import PySimpleGUI as sg import time mylist = [1,2,3,4,5,6,7,8] progressbar = [ [sg.ProgressBar(len(mylist), orientation='h', size=(51, 10), key='progressbar')] ] outputwin = [ [sg.Output(size=(78,20))] ] layout = [ [sg.Frame('Progress',layout= progressbar)], [sg.Frame('Output', layout = outputwin)], [sg.Submit('Start'),sg.Cancel()] ] window = sg.Window('Custom Progress Meter', layout) progress_bar = window['progressbar'] while True: event, values = window.read(timeout=10) if event == 'Cancel' or event is None: break elif event == 'Start': for i,item in enumerate(mylist): print(item) time.sleep(1) progress_bar.UpdateBar(i + 1) window.close()
Заключение
Как видите, нет ничего сложного в добавлении информации о прогрессе выполнения: кода немного, а отзывчивость повышается очень сильно. Используйте индикаторы, чтобы больше никогда не гадать, завис ли процесс или нет!