Главная > прикладное, Программирование > Python: Как сделать progress-bar в консоле?

Python: Как сделать progress-bar в консоле?

Давненько у меня возникал вопрос как сделаны прогресс-бары в консольных приложениях и как сделать нечто подобное самому. Но, вопрос никогда не стоял серъёзно, поэтому, максимум - я просто выводил проценты прогресса без каких-либо баров.

Но вот недавно решил нагуглил как это делается. Тут есть 2 пути:

  • несложный велосипед,
  • готовое приложение (в данном случае, рассмотрим clint).

Если вы не хотите плодить зависимостей (хотя нужные функции можно легко выдернуть из готового решения), то тут ничего сложного нет: просто печатаем необходимую информацию и пользуемся управляющим символом - "\r", что означает "перевод каретки", т.е. просто возврат курсора на начало строки. Например, так:

import sys
import time

def show_progress(value):
sys.stderr.write('%d\r' % value)

for i in xrange(10):
show_progress(i)
time.sleep(.1)

Примерно так и работает сам модуль clint (возможности его, кстати, шире чем исключительно рисование прогресс-бара). Если вы выберите всё же готовый вариант, то тут есть несколько решений: обычный прогресс-бар, "точки" на каждую итерацию, либо рисование "мельницы". Варианты использования модуля clint для этих целей:

import time

from clint.textui import progress

if __name__ == '__main__':
for i in progress.bar(range(10)):
sleep(.1)

for i in progress.dots(range(10)):
sleep(.1)

for i in progress.mill(range(10)):
sleep(0.1)

Установить этот модуль можно через pip, более подробно посмотреть возможные аргументы в исходном коде на github.

Вот пример работы одного модуля с использование бара из clint:

$ python main.py
some output here...
[############                    ] 79/200
Пожалуйста, оцените полезность и качество данной статьи. Одна звезда - плохо, 5 - хорошо.
1/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.2/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.3/5. Мы будем признательны, если вы напишете комментарий с причиной низкой оценки.4/5.5/5. (1 голосов, средний: 5,00 из 5)
Загрузка...
  1. elisk
    23 октября 2013 в 22:17 | #1

    Спасибо...хорошая статья.

  2. Orion
    20 марта 2014 в 19:30 | #2

    Progress: [===========================================] 100%

    def show_progress(value):
    length = 60
    percentage = value
    value = value*length/100
    sys.stderr.write('\rProgress: [' + '33[1;33m='*value + ' '*(length-value)
    + '33[1;32m] ' + str(percentage) + '%')

  1. Пока что нет уведомлений.