Para implementar una barra de estado como la siguiente:
[========== ] 45%
[================ ] 60%
[==========================] 100%
Quiero que esto se imprima en stdout, y siga actualizándolo, no imprima en otra línea. ¿Como hacer esto?
Respuestas:
Hay un módulo de Python que puede obtener de PyPI llamado
progressbar
que implementa dicha funcionalidad. Si no le importa agregar una dependencia, es una buena solución. De lo contrario, vaya con una de las otras respuestas.Un ejemplo simple de cómo usarlo:
Para instalarlo, puede usar
easy_install progressbar
, opip install progressbar
si prefiere pip.fuente
bar.start()
?bar.start()
sudo -H pip install progressbar2
.El
'\r'
carácter (retorno de carro) restablece el cursor al comienzo de la línea y le permite escribir sobre lo que estaba anteriormente en la línea.No estoy 100% seguro de si esto es completamente portátil en todos los sistemas, pero al menos funciona en Linux y OSX.
fuente
n=21
, sustituirrange(21)
conrange(n)
, a continuación, añadirj = (i + 1) / n
el interior del bucle, y sustituir lawrite
declaración con esta ligera modificación:sys.stdout.write("[%-20s] %d%%" % ('='*int(20*j), 100*j))
. Ahora el único cambio que necesita hacer esn=21
antes del ciclo (más probablen=len(iterable)
), luego enumerar sobre el objeto iterable. Recomiendo esta edición pero fue rechazada; aparentemente la funcionalidad "se desvía de la intención original de la publicación".sys.stdout.write("[{:{}}] {:.1f}%".format("="*i, n-1, (100/(n-1)*i)))
solo Python 3Encontré la biblioteca útil tqdm ( https://github.com/tqdm/tqdm/ , anteriormente: https://github.com/noamraph/tqdm ). Estima automáticamente el tiempo de finalización y puede usarse como iterador.
Uso:
Resultados en:
tqdm
puede envolver cualquier iterable.fuente
Puede usar
\r
( retorno de carro ). Manifestación:fuente
total
que10
, a continuación, se obtiene mensaje de errorZeroDivisionError: long division or modulo by zero
Aquí puede usar el siguiente código como función:
Con el uso de .format:
fuente
] percent * 100 %
basado en las respuestas anteriores y otras preguntas similares sobre la barra de progreso de la CLI, creo que obtuve una respuesta común general a todas ellas. Compruébelo en https://stackoverflow.com/a/15860757/2254146
Aquí hay una copia de la función, pero modificada para adaptarse a su estilo:
Parece
Porcentaje: [====================] 99.0%
fuente
Si está desarrollando una interfaz de línea de comandos, le sugiero que eche un vistazo,
click
que es muy agradable:Aquí la salida que obtienes:
fuente
Mejora aún más, utilizando una función como:
ejemplo de llamada:
salida:
fuente
Encontré este hilo hoy y después de haber probado esta solución de Mark Rushakoff
Puedo decir que esto funciona bien en W7-64 con Python 3.4.3 de 64 bits, pero solo en la consola nativa. Sin embargo, cuando se utiliza la consola incorporada de spyder 3.0.0dev, los saltos de línea siguen / nuevamente presentes. Como esto me llevó un tiempo resolver, me gustaría informar esta observación aquí.
fuente
Sobre la base de algunas de las respuestas aquí y en otros lugares, he escrito esta función simple que muestra una barra de progreso y el tiempo restante transcurrido / estimado. Debería funcionar en la mayoría de las máquinas basadas en Unix.
fuente
Este es un enfoque bastante simple que se puede usar con cualquier bucle.
fuente
Más fácil aún es
La clave es convertir el tipo entero a cadena.
fuente
Como se describe en la solución de Mark Rushakoff , puede generar el carácter de retorno de carro
sys.stdout.write('\r')
, para restablecer el cursor al comienzo de la línea. Para generalizar esa solución, al tiempo que implementa las cadenas f de Python 3 , puede usarfuente
Prueba PyProg. PyProg es una biblioteca de código abierto para Python para crear indicadores y barras de progreso súper personalizables.
Actualmente se encuentra en la versión 1.0.2; está alojado en Github y está disponible en PyPI (enlaces a continuación). Es compatible con Python 3 y 2 y también se puede usar con Qt Console.
Es realmente fácil de usar. El siguiente código:
producirá exactamente lo que desea (¡incluso la longitud de la barra!):
Para obtener más opciones para personalizar la barra de progreso, vaya a la página de Github de este sitio web.
Realmente hice PyProg porque necesitaba una biblioteca de barra de progreso simple pero súper personalizable. Se puede instalar fácilmente con:
pip install pyprog
.PyProg Github: https://github.com/Bill13579/pyprog
PyPI: https://pypi.python.org/pypi/pyprog/
fuente
Utilizando la respuesta de @ Mark-Rushakoff, elaboré un enfoque más simple, sin necesidad de llamar a la biblioteca del sistema. Funciona con Python 3. Probado en Windows:
fuente
print
hay una envoltura delgada que formatea la entrada y llama a la función de escritura de un objeto dado. Por defecto este objeto essys.stdout
.Aquí hay algo que hice usando la solución de @ Mark-Rushakoff. Para adaptarse adaptativamente al ancho del terminal.
fuente