Como uso uma barra de progresso quando meu script está executando alguma tarefa que provavelmente leva tempo?
Por exemplo, uma função que leva algum tempo para ser concluída e retorna True
quando concluída. Como posso exibir uma barra de progresso durante o tempo em que a função está sendo executada?
Observe que eu preciso que isso seja em tempo real, então não consigo descobrir o que fazer sobre isso. Preciso de um thread
para isso? Eu não faço ideia.
No momento, não estou imprimindo nada enquanto a função está sendo executada, no entanto, uma barra de progresso seria boa. Também estou mais interessado em como isso pode ser feito do ponto de vista do código.
Respostas:
Existem bibliotecas específicas ( como esta aqui ), mas talvez algo muito simples faria:
Nota: progressbar2 é uma bifurcação da progressbar que não é mantida há anos.
fonte
NameError: name 'xrange' is not defined
erro. Estou faltando um módulo?xrange
é o Python 3range
.print('■', end='', flush=True)
Com o tqdm, você pode adicionar um medidor de progresso aos seus loops em um segundo:
Além disso, existe uma versão gráfica do tqdm since
v2.0.0
(d977a0c
):Mas tenha cuidado, pois
tqdm_gui
pode gerar aTqdmExperimentalWarning: GUI is experimental/alpha
, você pode ignorá-lo usandowarnings.simplefilter("ignore")
, mas ele ignorará todos os avisos no seu código depois disso.fonte
__len__
propriedade ou o usuário deve fornecer ototal
argumentotqdm
. Senão, a barra funcionará, mas sem ETA.from tqdm import tqdm_notebook as tqdm
. Caso contrário, não o escreverá em uma linha.As sugestões acima são muito boas, mas acho que a maioria das pessoas quer apenas uma solução pronta, sem dependências de pacotes externos, mas também é reutilizável.
Consegui os melhores pontos de todas as opções acima e transformei-as em uma função, juntamente com um caso de teste.
Para usá-lo, basta copiar as linhas em "def update_progress (progress)", mas não o script de teste. Não se esqueça de importar o sistema. Ligue para isso sempre que precisar exibir ou atualizar a barra de progresso.
Isso funciona enviando diretamente o símbolo "\ r" para o console para mover o cursor de volta ao início. "print" em python não recongise o símbolo acima para esse fim, portanto precisamos de 'sys'
Isto é o que o resultado do script de teste mostra (a última barra de progresso é animada):
fonte
in range(101)
não deve dizer 100, o progresso para em 99% e nunca é exibido.Essa resposta não depende de pacotes externos , também acho que a maioria das pessoas quer apenas um pedaço de código pronto . O código abaixo pode ser adaptado para atender às suas necessidades, personalizando: símbolo de progresso da
'#'
barrasize
, barra , textoprefix
etc.Uso:
Resultado:
Não requer um segundo segmento . Algumas soluções / pacotes acima exigem. Um segundo encadeamento pode ser um problema
jupyter notebook
, por exemplo , para um .Funciona com qualquer iterável , significa qualquer coisa que
len()
possa ser usada. Alist
, adict
de qualquer coisa, por exemplo['a', 'b', 'c' ... 'g']
Você também pode alterar a saída alterando o arquivo para,
sys.stderr
por exemplofonte
TypeError: object of type 'generator' has no len()
generators
) você precisa envolvê-lo com alist()
. Gostofor i in progressbar(list(your_generator), "Computing: ", 40):
para uma aplicação semelhante (acompanhando o progresso em um loop), simplesmente usei a python-progressbar :
O exemplo deles é mais ou menos assim,
fonte
progressbar2
pacote. O código acima funcionará com ele.import *
?Experimente o progresso em https://pypi.python.org/pypi/progress .
O resultado será uma barra como a seguinte:
fonte
progress
produz barras agradáveis, mas falha se outro software estiver manipulandostderr
. desculpe, mas não investiguei o problema exato.Acabei de fazer uma classe de progresso simples para minhas necessidades depois de procurar aqui uma solução equivalente. Eu pensei que poderia muito bem publicá-lo.
Exemplo:
Irá imprimir o seguinte:
[======== ] 17/80 ( 21%) 63 to go
fonte
progress.current
incremento no final de__call__
para limitar ainda mais a interação com o objeto a partir do código principal.Gosto da resposta de Brian Khuu por sua simplicidade e por não precisar de pacotes externos. Eu mudei um pouco, então estou adicionando minha versão aqui:
Leva o número total de execuções (
total
) e o número de execuções processadas até agora (progress
) assumindototal >= progress
. O resultado fica assim:fonte
Você pode usar o tqdm :
Neste exemplo, a barra de progresso está em execução por 5 minutos e é mostrada assim:
Você pode alterá-lo e personalizá-lo como quiser.
fonte
Para usar qualquer estrutura de barra de progresso de uma maneira útil, ou seja, para obter uma porcentagem real de progresso e um ETA estimado, você precisa ser capaz de declarar quantas etapas ele terá.
Então, sua função de computação em outro encadeamento, você pode dividir em várias etapas lógicas? Você pode modificar o código?
Você não precisa refatorar ou dividir em métodos reais; basta colocar alguns
yield
s estratégicos em alguns lugares dentro dele! Se a função cara tiver um loop for , basta colocar um. No final, você só deve saber quanto rendimento será obtido para obter melhores resultados.Dessa forma, sua função pode ser algo como isto:
ou isto:
Com esse tipo de função, você pode instalar:
E use-o como:
Para obter uma barra de progresso legal!
Isenção de responsabilidade: eu sou o autor de alive_progress, mas isso deve resolver seu problema de maneira adequada. Leia a documentação em https://github.com/rsalmei/alive-progress , aqui está um exemplo do que ele pode fazer:
fonte
Eu realmente gosto da python-progressbar , pois é muito simples de usar.
Para o caso mais simples, é apenas:
A aparência pode ser personalizada e pode exibir o tempo restante estimado. Por exemplo, use o mesmo código acima, mas com:
fonte
Se for um loop grande com uma quantidade fixa de iterações que está demorando muito tempo, você pode usar esta função que eu criei. Cada iteração de loop adiciona progresso. Onde count é a iteração atual do loop, total é o valor para o qual você está fazendo loop e size (int) é o tamanho que você deseja para a barra em incrementos de 10, isto é (tamanho 1 = 10 caracteres, tamanho 2 = 20 caracteres)
exemplo:
resultado:
fonte
Use esta biblioteca:
fish
( GitHub ).Uso:
Diverta-se!
fonte
O código abaixo é uma solução bastante geral e também tem um tempo decorrido e uma estimativa de tempo restante. Você pode usar qualquer iterável com ele. A barra de progresso tem um tamanho fixo de 25 caracteres, mas pode mostrar atualizações em etapas de 1% usando caracteres completos, meio e trimestre. A saída é assim:
Código com exemplo:
Sugestões de melhorias ou outros comentários são bem-vindos. Felicidades!
fonte
Eu gosto desta página .
Começa com um exemplo simples e passa para uma versão multiencadeada. Trabalha fora da caixa. Não são necessários pacotes de terceiros.
O código será algo como isto:
Ou aqui está um exemplo para usar threads para executar a barra de carregamento giratória enquanto o programa está sendo executado:
fonte
É bastante direto no Python3:
fonte
Ao executar em notebooks jupyter, o uso do tqdm normal não funciona, pois grava a saída em várias linhas. Use isto:
fonte
Se seu trabalho não puder ser dividido em partes mensuráveis, você poderá chamar sua função em um novo thread e tempo quanto tempo leva:
Obviamente, você pode aumentar a precisão do tempo, conforme necessário.
fonte
Eu gosto da resposta do Gabriel , mas mudei para ser flexível. Você pode enviar o comprimento da barra para a função e obter a barra de progresso com o tamanho que desejar. E você não pode ter uma barra de progresso com comprimento zero ou negativo. Além disso, você pode usar esta função como a resposta do Gabriel (veja o exemplo 2).
Resultado:
fonte
Eu usei o
format()
método para fazer uma barra de carga. Aqui está a minha solução:Resultado:
fonte
Aqui está uma solução curta que cria a barra de carregamento programaticamente (você deve decidir quanto tempo deseja).
fonte
Experimente o PyProg. PyProg é uma biblioteca de código aberto para Python para criar barras e indicadores de progresso super personalizáveis.
Atualmente, está na versão 1.0.2; está hospedado no Github e disponível no PyPI (links abaixo). É compatível com Python 3 e 2 e também pode ser usado com o Qt Console.
É realmente fácil de usar. O código a seguir:
vai produzir:
Na verdade, eu criei o PyProg porque precisava de uma biblioteca de barras de progresso simples, mas super personalizável. Você pode facilmente instalá-lo com:
pip install pyprog
.PyProg Github: https://github.com/Bill13579/pyprog
PyPI: https://pypi.python.org/pypi/pyprog/
fonte
Você também pode usar o esclarecer . A principal vantagem é que você pode fazer logon ao mesmo tempo sem substituir sua barra de progresso.
Ele também lida com várias barras de progresso.
fonte
Use a biblioteca de progresso !
Aqui está uma subclasse personalizada que escrevi para formatar os tempos ETA / Decorridos para um formato melhor legível:
fonte
Esta é a minha solução simples:
fonte
Você deve vincular a barra de progresso à tarefa em questão (para medir o progresso: D). Por exemplo, se você estiver enviando um arquivo por FTP, você pode dizer ao ftplib para pegar um determinado tamanho de buffer, digamos 128K, e depois adicionar à sua barra de progresso qualquer porcentagem do tamanho do arquivo que 128k representa. Se você estiver usando a CLI e seu medidor de progresso tiver 20 caracteres, você adicionará um caractere quando 1/20 do arquivo for transferido.
fonte
@ Massagran: Funciona bem nos meus programas. Além disso, precisamos adicionar um contador para indicar os tempos de loop. Este contador funciona como o argumento do método
update
. Por exemplo: leia todas as linhas de um arquivo de teste e trate-as em algo. Suponha que a funçãodosth()
não se preocupe na variáveli
.A variável
i
controla o status depbar
através do métodoupdate
fonte
uma resposta um pouco mais genérica de jelde015 (crédito para ele, é claro)
para atualizar a barra de carregamento manualmente será:
e chamando por:
resultará:
basta chamá-lo sempre que quiser com o
i
valor atual .defina
size
como o número de caracteres que a barra deve serfonte
Acho que estou um pouco atrasado, mas isso deve funcionar para as pessoas que trabalham com as versões atuais do python 3 , pois ele usa "f-strings" , conforme apresentado no Python 3.6 PEP 498 :
Código
Exemplo
Resultado
fonte
Esta é uma maneira simples de criar uma barra de progresso
fonte