
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.

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.

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
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 size
texto 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:

-
No requiere un segundo hilo. Algunas soluciones/paquetes anteriores requieren.
-
Funciona con cualquier iterable. significa cualquier cosa que len()
se puede usar en. A list
a 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

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
¿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