Barra de progreso de Python

3 minutos de lectura

Barra de progreso de Python
usuario225312

¿Cómo uso una barra de progreso cuando mi secuencia de comandos está realizando una tarea que probablemente llevará tiempo?

Por ejemplo, una función que tarda algún tiempo en completarse y devuelve True cuando termine. ¿Cómo puedo mostrar una barra de progreso durante el tiempo que se ejecuta la función?

Tenga en cuenta que necesito que esto sea en tiempo real, por lo que no puedo averiguar qué hacer al respecto. ¿Necesito un thread ¿para esto? No tengo ni idea.

En este momento no estoy imprimiendo nada mientras se ejecuta la función, sin embargo, una barra de progreso estaría bien. También estoy más interesado en cómo se puede hacer esto desde el punto de vista del código.

  • ¿Está utilizando un kit de herramientas GUI o CLI solamente?

    – Bobby

    1 de julio de 2010 a las 18:41


  • CLI. Pero puedo usar una biblioteca de terceros, eso no es problema. Con GUI puedo hacer esto, pero estaba interesado en la parte CLI.

    – usuario225312

    1 de julio de 2010 a las 18:42

  • Posible duplicado de la barra de progreso de texto en la consola Tenga en cuenta que si bien esta pregunta se publicó tres días antes, la pregunta vinculada se ve con más frecuencia.

    – Palo verde

    13 de agosto de 2016 a las 0:03


  • Aquí hay una solución para dentro de un Jupyter Notebook: mikulskibartosz.name/…

    – Steven C. Howell

    12 de abril de 2019 a las 15:51

  • ¡He publicado un nuevo tipo de barra de progreso, que puede imprimir, ver el rendimiento y el eta, incluso pausarlo, además de las animaciones geniales! Por favor echa un vistazo: github.com/rsalmei/alive-progreso !progreso vivo

    – rsalmei

    23 de agosto de 2019 a las 6:43

1646760369 517 Barra de progreso de Python
christopheD

Hay bibliotecas específicas (como este de aquí) pero tal vez algo muy simple haría:

import time
import sys

toolbar_width = 40

# setup toolbar
sys.stdout.write("[%s]" % (" " * toolbar_width))
sys.stdout.flush()
sys.stdout.write("\b" * (toolbar_width+1)) # return to start of line, after '['

for i in xrange(toolbar_width):
    time.sleep(0.1) # do real work here
    # update the bar
    sys.stdout.write("-")
    sys.stdout.flush()

sys.stdout.write("]\n") # this ends the progress bar

Nota: barra de progreso2 es un tenedor de barra de progreso que no se ha mantenido en años.

  • esto no escala para muchos pasos… pypi.python.org/pypi/progreso es mucho más fácil de usar

    – m13r

    8 mayo 2015 a las 21:55

  • Probé este código, y arrojó un NameError: name 'xrange' is not defined error. ¿Me falta un módulo?

    – Hombre Champiñón

    18 de mayo de 2016 a las 1:11


  • @GokuMcSpock9733 ¿Qué versión de Python estás usando? Python 2 xrange es python 3 range.

    – quapka

    20 mayo 2016 a las 17:49

  • Esta no debería ser la respuesta principal. La otra respuesta (con tqdm) es mucho mejor para mí al menos.

    – Florián

    20 de marzo de 2017 a las 14:39

  • Barra de progreso de los pobres en Python 3: print('■', end='', flush=True)

    – patrickt

    7 de mayo de 2020 a las 6:30

  • Este es realmente el mejor que he visto en stackoverflow.

    – Dexter

    30 de junio de 2020 a las 19:57

  • esto es genial, no soy un admirador típico, pero esta versión es increíble. bien hecho hermano <3

    – prhmma

    23 de agosto de 2020 a las 13:36

  • Muy elegante y fácil de usar.

    – Jay Modi

    2 oct 2020 a las 14:41

  • ¡Me encanta! ¿Cómo te va con la compatibilidad con jupyter notebook?

    – blupp

    19 de diciembre de 2020 a las 11:55

  • Mejor ejemplo: GIF vivo-progreso

    – Milovan Tomašević

    31 de diciembre de 2020 a las 7:15

1646760370 724 Barra de progreso de Python
Brian Khuu

Las sugerencias anteriores son bastante buenas, pero creo que la mayoría de la gente solo quiere una solución lista para usar, sin dependencias de paquetes externos, pero que también sea reutilizable.

Obtuve los mejores puntos de todo lo anterior y lo convertí en una función, junto con casos de prueba.

Para usarlo, simplemente copie las líneas debajo de “def update_progress (progreso)”, pero no el script de prueba. No olvides importar sys. Llame a esto cada vez que necesite mostrar o actualizar la barra de progreso.

Esto funciona enviando directamente el símbolo “\r” a la consola para mover el cursor de regreso al inicio. “imprimir” en python no reconoce el símbolo anterior para este propósito, por lo tanto, necesitamos ‘sys’

import time, sys

# update_progress() : Displays or updates a console progress bar
## Accepts a float between 0 and 1. Any int will be converted to a float.
## A value under 0 represents a 'halt'.
## A value at 1 or bigger represents 100%
def update_progress(progress):
    barLength = 10 # Modify this to change the length of the progress bar
    status = ""
    if isinstance(progress, int):
        progress = float(progress)
    if not isinstance(progress, float):
        progress = 0
        status = "error: progress var must be float\r\n"
    if progress < 0:
        progress = 0
        status = "Halt...\r\n"
    if progress >= 1:
        progress = 1
        status = "Done...\r\n"
    block = int(round(barLength*progress))
    text = "\rPercent: [{0}] {1}% {2}".format( "#"*block + "-"*(barLength-block), progress*100, status)
    sys.stdout.write(text)
    sys.stdout.flush()


# update_progress test script
print "progress : 'hello'"
update_progress("hello")
time.sleep(1)

print "progress : 3"
update_progress(3)
time.sleep(1)

print "progress : [23]"
update_progress([23])
time.sleep(1)

print ""
print "progress : -10"
update_progress(-10)
time.sleep(2)

print ""
print "progress : 10"
update_progress(10)
time.sleep(2)

print ""
print "progress : 0->1"
for i in range(101):
    time.sleep(0.1)
    update_progress(i/100.0)

print ""
print "Test completed"
time.sleep(10)

Esto es lo que muestra el resultado del script de prueba (se anima la última barra de progreso):

progress : 'hello'
Percent: [----------] 0% error: progress var must be float
progress : 3
Percent: [##########] 100% Done...
progress : [23]
Percent: [----------] 0% error: progress var must be float

progress : -10
Percent: [----------] 0% Halt...

progress : 10
Percent: [##########] 100% Done...

progress : 0->1
Percent: [##########] 100% Done...
Test completed

  • La prueba animada (la última) debería decir in range(101) no 100, el progreso se detiene en el 99 % y nunca se muestra terminado.

    – Nick Humrich

    17 de noviembre de 2014 a las 22:47

  • ¡Esta es una respuesta genial! Dos sugerencias: 1) puedes usar print(..., end='') en lugar de llamar stdout.write() + stdout.flush(). 2) si pones \r al final de la cadena en lugar del principio, funciona mucho mejor con otra salida de consola.

    – Tim brilla

    11 de diciembre de 2020 a las 21:43


  • ¿Cómo se sobrescribe la barra de progreso cada vez que se actualiza, en lugar de agregar nuevas líneas a la consola cada vez?

    – usuario5359531

    5 de febrero de 2021 a las 15:37

  • @user5359531 intente la siguiente respuesta

    – iambr

    27 de marzo de 2021 a las 16:06

Esta respuesta no se basa en paquetes externos.Yo tambien pienso eso la mayoría de la gente solo quiere una pieza de código lista para usar. El siguiente código se puede adaptar a sus necesidades mediante la personalización: barra símbolo de progreso '#'bar sizetexto prefix etc

import sys

def progressbar(it, prefix="", size=60, file=sys.stdout):
    count = len(it)
    def show(j):
        x = int(size*j/count)
        file.write("%s[%s%s] %i/%i\r" % (prefix, "#"*x, "."*(size-x), j, count))
        file.flush()        
    show(0)
    for i, item in enumerate(it):
        yield item
        show(i+1)
    file.write("\n")
    file.flush()

Uso:

import time

for i in progressbar(range(15), "Computing: ", 40):
    time.sleep(0.1) # any calculation you need

Producción:

Barra de progreso de Python

  • No requiere un segundo hilo. Algunas soluciones/paquetes anteriores requieren.

  • Funciona con cualquier iterable. significa cualquier cosa que len() se puede usar en. A lista dict de cualquier cosa por ejemplo ['a', 'b', 'c' ... 'g']

  • Funciona con generadores. solo tiene que envolverlo con una lista (). Por ejemplo for i in progressbar(list(your_generator), "Computing: ", 40): A menos que el trabajo se realice en el generador. En ese caso, necesita otra solución (como tqdm).

También puede cambiar la salida cambiando el archivo a sys.stderr por ejemplo

  • La prueba animada (la última) debería decir in range(101) no 100, el progreso se detiene en el 99 % y nunca se muestra terminado.

    – Nick Humrich

    17 de noviembre de 2014 a las 22:47

  • ¡Esta es una respuesta genial! Dos sugerencias: 1) puedes usar print(..., end='') en lugar de llamar stdout.write() + stdout.flush(). 2) si pones \r al final de la cadena en lugar del principio, funciona mucho mejor con otra salida de consola.

    – Tim brilla

    11 de diciembre de 2020 a las 21:43


  • ¿Cómo se sobrescribe la barra de progreso cada vez que se actualiza, en lugar de agregar nuevas líneas a la consola cada vez?

    – usuario5359531

    5 de febrero de 2021 a las 15:37

  • @user5359531 intente la siguiente respuesta

    – iambr

    27 de marzo de 2021 a las 16:06

Barra de progreso de Python
Massagrán

para una aplicación similar (manteniendo un registro del progreso en un bucle) simplemente usé el Python-barra de progreso:

Su ejemplo es algo así,

from progressbar import *               # just a simple progress bar


widgets = ['Test: ', Percentage(), ' ', Bar(marker="0",left="[",right="]"),
           ' ', ETA(), ' ', FileTransferSpeed()] #see docs for other options

pbar = ProgressBar(widgets=widgets, maxval=500)
pbar.start()

for i in range(100,500+1,50):
    # here do something long at each iteration
    pbar.update(i) #this adds a little symbol at each iteration
pbar.finish()
print

  • Para compatibilidad con Python 3, intente progressbar2 paquete. El código anterior funcionará con él.

    – d33tah

    25 de mayo de 2018 a las 8:11

  • ¿De verdad acabas de usar import *?

    -Eric

    25 de diciembre de 2019 a las 23:21

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad