Pull to refresh

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

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

Недавно нашёл выход: модуль 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
Tags:
Hubs:
+59
Comments 30
Comments Comments 30

Articles