Python Progress Bar - PullRequest
       58

Python Progress Bar

227 голосов
/ 01 июля 2010

Как использовать индикатор выполнения, когда мой скрипт выполняет какое-то задание, которое может занять время?

Например, функция, выполнение которой занимает некоторое время и возвращает True по завершении. Как я могу отображать индикатор выполнения во время выполнения функции?

Обратите внимание, что мне нужно, чтобы это было в режиме реального времени, поэтому я не могу понять, что с этим делать. Нужно ли мне thread для этого? Понятия не имею.

Прямо сейчас я ничего не печатаю во время выполнения функции, однако индикатор выполнения был бы неплох. Также меня больше интересует, как это можно сделать с точки зрения кода.

Ответы [ 27 ]

0 голосов
/ 05 марта 2019

Это простой способ создать индикатор выполнения

import time,sys
toolbar_width = 50
# setting up toolbar [-------------------------------------]
sys.stdout.write("[%s]"%(("-")*toolbar_width))
sys.stdout.flush()
# each hash represents 2 % of the progress
for i in range(toolbar_width):
    sys.stdout.write("\r") # return to start of line
    sys.stdout.flush()
    sys.stdout.write("[")#Overwrite over the existing text from the start 
    sys.stdout.write("#"*(i+1))# number of # denotes the progress completed 
    sys.stdout.flush()
    time.sleep(0.1)
0 голосов
/ 01 марта 2019

Думаю, я немного опоздал, но это должно работать для людей, работающих с текущими версиями python 3 , так как при этом используется "f-strings" , как представлено в Python 3,6 PEP 498 :

Код

from numpy import interp

class Progress:
    def __init__(self, value, end, title='Downloading',buffer=20):
        self.title = title
        #when calling in a for loop it doesn't include the last number
        self.end = end -1
        self.buffer = buffer
        self.value = value
        self.progress()

    def progress(self):
        maped = int(interp(self.value, [0, self.end], [0, self.buffer]))
        print(f'{self.title}: [{"#"*maped}{"-"*(self.buffer - maped)}]{self.value}/{self.end} {((self.value/self.end)*100):.2f}%', end='\r')

Пример

#some loop that does perfroms a task
for x in range(21)  #set to 21 to include until 20
    Progress(x, 21)

выход

Downloading: [########------------] 8/20 40.00%
0 голосов
/ 30 января 2019

используйте os_sys lib:

Я использую его для многих типов баров, например:

from os_sys.progress import bar as Bar bar = Bar('progresing: ', max=20) for i in range(20): #do somthing bar.next() bar.finish() Ваш вывод будет:

procesing:  |######                          | 2/10

Подробнее читайте в описании os_sys

0 голосов
/ 06 ноября 2018

немного более общий ответ jelde015 (кредит ему, конечно)

для обновления полосы загрузки вручную будет:

import sys
from math import *


def loadingBar(i, N, size):
    percent = float(i) / float(N)
    sys.stdout.write("\r"
                     + str(int(i)).rjust(3, '0')
                     +"/"
                     +str(int(N)).rjust(3, '0')
                     + ' ['
                     + '='*ceil(percent*size)
                     + ' '*floor((1-percent)*size)
                     + ']')

и позвонив по:

loadingBar(7, 220, 40)

приведет к:

007/220 [=                                       ]  

просто вызывайте его, когда хотите, с текущим значением i.

установить size в качестве количества символов в баре, которое должно быть

0 голосов
/ 09 мая 2018

Вы также можете использовать просветить .Основное преимущество заключается в том, что вы можете одновременно регистрироваться без перезаписи индикатора выполнения.

import time
import enlighten

manager = enlighten.Manager()
pbar = manager.counter(total=100)

for num in range(1, 101):
    time.sleep(0.05)
    print('Step %d complete' % num)
    pbar.update()

Он также обрабатывает несколько индикаторов выполнения.

import time
import enlighten

manager = enlighten.Manager()
odds = manager.counter(total=50)
evens = manager.counter(total=50)

for num in range(1, 101):
    time.sleep(0.05)
    if num % 2:
        odds.update()
    else:
        evens.update()
0 голосов
/ 16 октября 2013

@ Массагран: Это хорошо работает в моих программах.Кроме того, нам нужно добавить счетчик, чтобы указать время цикла.Этот счетчик играет роль аргумента метода update.Например: прочитайте все строки тестового файла и обработайте их на чем-нибудь.Предположим, что функция dosth() не относится к переменной i.

<code>lines = open(sys.argv[1]).readlines()
i = 0
widgets=[Percentage(), Bar()]
pbar = ProgressBar(widgets=widgets,maxval=len(lines)).start()
pbar.start()
for line in lines:<pre>
    dosth();
    i += 1
    pbar.update(i)
pbar.finish ()

Переменная i контролирует состояние pbar черезметод update

0 голосов
/ 01 июля 2010

Вы должны связать индикатор выполнения с текущей задачей (чтобы она измеряла прогресс: D). Например, если вы отправляете файл по FTP, вы можете указать ftplib захватить буфер определенного размера, скажем, 128 КБ, а затем добавить в индикатор выполнения любой процент от размера файла 128 КБ. Если вы используете CLI, а ваш индикатор прогресса имеет длину 20 символов, вы добавите один символ, когда будет передана 1/20 файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...