Простой консольный прогрессбар на питоне

    В связи с некоторыми вычислениями на питоне (например, подсчётом коэффициента симметрии карты реликтового излучения) мне захотелось сделать процесс более наглядным. Ну хотя бы добавить прогресс-бар. Скучно, знаете ли, сидеть перед пустой консолью и втыкать на запущенную команду. То ли работает, то ли висит… с ходу не понять. А делать какой-нибудь лог исполнения не хочется, так как потом в полученом хаосе глаз теряется.

    Недавно нашёл выход: модуль progressbar. Модуль существует в deb-репозиториях (я нашёл его в репозиториях ubuntu 9.10), ставится пакетом python-progressbar:
    Copy Source | Copy HTML
    1. sudo apt-get install python-progressbar


    Для начала можно попробовать запустить небольшой пример:
    Copy Source | Copy HTML
    1. #!/usr/bin/python
    2. # -*- coding: utf-8 -*-
    3. import progressbar
    4. import time
    5.  
    6. bar = progressbar.ProgressBar().start() # Создаём новый progress bar
    7.  
    8. for t in xrange(101):
    9.     bar.update(t) # Таким образом можно устанавливать значение.
    10.     time.sleep(0.01)
    11. bar.finish() # Заканчиваем обновлять -- далее можно
    12. print "finished =)"


    Теперь немного поподробнее о самых простых и часто встречающихся случаях использования (насколько могу себе их помыслить).

    Во-первых в конструкторе progressbar.ProgressBar(maxval=100) есть аргумет maxval, задающий максимальное значение в полоске. Он может быть как целый, так и вещественный. Соответственно, в progressbar.ProgressBar.update() можно также передавать вещественное число.
    Copy Source | Copy HTML
    1. #!/usr/bin/python
    2. # -*- coding: utf-8 -*-
    3. import progressbar
    4. import time
    5.  
    6. bar = progressbar.ProgressBar(maxval=10.0).start()
    7.  
    8. t = 0.0
    9. while t <= 1.0:
    10.     bar.update(t)
    11.     time.sleep(0.01)
    12.     t += 0.01
    13. bar.finish()


    И, наконец, о вкусном: виджеты. Ещё одним аргументом в конструктор progressbar.ProgressBar() можно передать массив виджетов. Каждый виджет имеет ряд своих настроек. Наибольшее количество, видимо, у штуки progressbar.Bar. Из следующего примера должно быть очевидно, как можно просто и непринуждённо использовать свой набор виджетов:
    Copy Source | Copy HTML
    1. #!/usr/bin/python
    2. # -*- coding: utf-8 -*-
    3. import progressbar
    4. import time
    5.  
    6. bar = progressbar.ProgressBar(maxval=10.0, widgets=[
    7.     'Just a progress bar test: ', # Статический текст
    8.     progressbar.Bar(left='[', marker='=', right=']'), # Прогресс
    9.     progressbar.ReverseBar(left='[', marker='*', right=']'), # Регресс
    10.     progressbar.SimpleProgress(), # Надпись "6 из 10"
    11. ]).start()
    12.  
    13. t = 0.0
    14. while t <= 10.0:
    15.     bar.update(t)
    16.     time.sleep(0.01)
    17.     t += 0.1
    18. bar.finish()


    image

    К модулю прилогается подробная документация. Так что проблем с освоением возникнуть не должно. Хотя последний пример, я думаю, покрывает 90% всех задач.

    Из минусов модуля можно отметить нежелание работать в консоли Windows.

    UPD by xvoland: python-progressbar on pypi.python.org
    Метки:
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 30
    • +2
      А скриншоты?
      • +1
        Вам консоль сфотографировть? Сейчас будет =)
      • 0
        о, вроде стандартная штука, а я не знал. Пасиб, забираю в избранное. на досуге попробую применить.
        • 0
          Можете перенести в «Язык программирования Python» :-)
          • 0
            Как-раз карма набралась =)
            • 0
              ага, питоноводов всегда плюсую :-)
          • 0
            Спасибо, отличная плюшка, давно хотел такую
            • 0
              ____
              супер реально, я свое написал
              Всего: 1428, Обработано: 1230 ( 86% ), осталось: 198 ( 22.04: 22.01.10 12:35:44 ), Время 3.34( 0.11 в сек )

              Но это реально удобней.
              • 0
                ( не совсем удобно, что выводить больше (пока прогрес бар идет) ничего нельзя, так как тогда прогресс бар смещается.
                • 0
                  Ну это уже надо поуши влезать в ncurses или вообще на GUI переходить. Хотя можно просто сообщения в файлы выбрасывать и смотреть их через tail -f в соседней консоли.
              • –2
                Спасибо за топик.
                • –2
                  спасибо, пригодится…
                  • +7
                    Мда ребят… я такое на паскале лет 8 назад делал.

                    удивлен, что о такой работе пишут на хабре
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • +2
                      А я не понимаю, зачем нужны такие комментарии. И что?
                    • +3
                      А для PHP есть Console_ProgressBar. Может быть мне тоже об этом статью написать…
                      • +1
                        И сколько, из тех, кому это может пригодиться, знает об этой библиотеке?
                        • 0
                          Спасибо, проапдейтил.
                          • +1
                            лучше ставить через easy_install progressbar

                            =)

                            p.s.: пользуйтесь
                        • +4
                          Автору спасибо, не знал про этот модуль. Жаль, конечно, что он не входит в стандартные, придётся зависимость добавлять в проект.

                          Кстати, можно легко использовать этот прогрессбар для индикации процесса скачивания файла из сети:
                          Copy Source | Copy HTML
                          1. #!/usr/bin/python
                          2. # -*- coding: utf8 -*-
                          3. import urllib, progressbar
                          4.  
                          5. url = 'http://example.com/file.mp3'
                          6.  
                          7. def loadProgress(bl, blsize, size):
                          8.     dldsize = min(bl*blsize, size)
                          9.     p = float(dldsize) / size
                          10.     bar.update(p)
                          11.  
                          12. bar = progressbar.ProgressBar(maxval=1. 0, widgets=[
                          13.       'Загрузка файла ',
                          14.       progressbar.Bar(left='[', marker='=', right=']'),
                          15.       progressbar.Percentage()
                          16.       ]).start()
                          17.  
                          18. urllib.urlretrieve(url, 'myfile.mp3', loadProgress)
                          19. bar.finish()
                          • 0
                            > Из минусов модуля можно отметить нежелание работать в консоли Windows.
                            Заработало с первой подачи (winXPsp3, python 2.5):
                            winxpsp3-console-progressbar.py-run

                            В ваших исходниках-примерах вещественные числа «разъехались».
                            • 0
                              Ну у меня не заработало (просто пустая строка была), хотя это и абсолютно не целевая, для меня, ОС. Сегодня ещё разок попробую.

                              Про вещественные числа — какая-то проблема с подсвечивалкой. Уже пробовал «съехать». Результат — не очень.
                              • 0
                                В примере с виджетами сругнулся на 10 строке, что в progressbar.py не найден метод:
                                    progressbar.SimpleProgress(), # Надпись "6 из 10"

                                просто комментируем и нормально работает.
                                • 0
                                  Посмотри доки модуля и проверь его версию (моя сейчас progressbar2.2 от 2006-05-07). Возможно у тебя нету класса progressbar.SimpleProgress.
                            • 0
                              Я обычно использовал dialog для этого. Вот моя питоновская обертка к нему(второй пример — как раз прогрессбар): pawnhearts.ru/software/dlg/
                              • 0
                                Спасибо, буду знать. К сожалению, сейчас не могу пощупать руками — можешь показать, как это выглядит?
                            • 0
                              Удобная штука, мерси за хинт.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.