¿Cómo uso una barra de progreso cuando mi script está realizando alguna tarea que probablemente tome tiempo?
Por ejemplo, una función que tarda un tiempo en completarse y vuelve True
cuando termina . ¿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 entender qué hacer al respecto. ¿Necesito un thread
para esto? No tengo 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.
Respuestas:
Hay bibliotecas específicas ( como esta aquí ) pero quizás algo muy simple haría:
Nota: progressbar2 es una bifurcación de barra de progreso que no se ha mantenido en años.
fuente
NameError: name 'xrange' is not defined
error. ¿Me estoy perdiendo un módulo?xrange
es Python 3range
.print('■', end='', flush=True)
Con tqdm puedes agregar un medidor de progreso a tus bucles en un segundo:
Además, hay una versión gráfica de tqdm ya que
v2.0.0
(d977a0c
):Pero tenga cuidado, ya que
tqdm_gui
puede elevar unTqdmExperimentalWarning: GUI is experimental/alpha
, puede ignorarlo usandowarnings.simplefilter("ignore")
, pero ignorará todas las advertencias en su código después de eso.fuente
__len__
propiedad o el usuario debe proporcionar eltotal
argumentotqdm
. De lo contrario, el bar funcionará pero sin ETA.from tqdm import tqdm_notebook as tqdm
. De lo contrario, no lo escribe en una línea.Las sugerencias anteriores son bastante buenas, pero creo que la mayoría de la gente solo quiere una solución preparada, sin dependencias de paquetes externos, pero también es reutilizable.
Obtuve los mejores puntos de todo lo anterior, y lo convertí en una función, junto con un caso 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 siempre 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'
Esto es lo que muestra el resultado del script de prueba (La última barra de progreso anima):
fuente
in range(101)
no 100, el progreso se detiene en 99% y nunca se muestra hecho.Esta respuesta no se basa en paquetes externos , también creo que la mayoría de las personas solo quieren un código listo . El código a continuación se puede adaptar para satisfacer sus necesidades personalizando: símbolo de progreso de
'#'
barrasize
, barra , texto,prefix
etc.Uso:
Salida:
No requiere un segundo hilo . Algunas soluciones / paquetes anteriores requieren. Un segundo hilo puede ser un problema
jupyter notebook
, por ejemplo , para un .Funciona con cualquier iterable , significa cualquier cosa que
len()
pueda usarse. Alist
, adict
de cualquier cosa, por ejemplo['a', 'b', 'c' ... 'g']
También puede cambiar la salida cambiando el archivo a,
sys.stderr
por ejemplofuente
TypeError: object of type 'generator' has no len()
generators
) tienes que envolverlo con alist()
. Me gustafor i in progressbar(list(your_generator), "Computing: ", 40):
para una aplicación similar (hacer un seguimiento del progreso en un bucle) simplemente usé la barra de progreso de python :
Su ejemplo es algo como esto,
fuente
progressbar2
paquete. El código anterior funcionará con él.import *
?Pruebe el progreso desde https://pypi.python.org/pypi/progress .
El resultado será una barra como la siguiente:
fuente
progress
hace buenas barras, pero falla si otro software está manipulandostderr
. lo siento, pero no he investigado el problema exacto.Acabo de hacer una clase de progreso simple para mis necesidades después de buscar aquí una solución equivalente. Pensé que podría publicarlo bien.
Ejemplo:
Imprimirá lo siguiente:
[======== ] 17/80 ( 21%) 63 to go
fuente
progress.current
incremento al final__call__
para limitar aún más la interacción con el objeto desde el código principal.Me gusta la respuesta de Brian Khuu por su simplicidad y por no necesitar paquetes externos. Lo cambié un poco, así que agrego mi versión aquí:
Toma el número total de ejecuciones (
total
) y el número de ejecuciones procesadas hasta ahora (progress
) suponiendototal >= progress
. El resultado se ve así:fuente
Puedes usar tqdm :
En este ejemplo, la barra de progreso se ejecuta durante 5 minutos y se muestra así:
Puede cambiarlo y personalizarlo a su gusto.
fuente
Para utilizar los marcos de la barra de progreso de una manera útil, es decir, para obtener un porcentaje de progreso real y una ETA estimada, debe poder declarar cuántos pasos tendrá.
Entonces, su función de cálculo en otro hilo, ¿puede dividirla en varios pasos lógicos? ¿Puedes modificar su código?
No necesita refactorizarlo o dividirlo en métodos reales, ¡simplemente podría poner algunas estrategias estratégicas
yield
en algunos lugares dentro de él! Si la función costosa tiene un bucle for , simplemente ponga uno en él. Solo debe saber al final cuántos rendimientos se harán, para obtener los mejores resultados.De esa manera, su función podría ser algo como esto:
o esto:
Con ese tipo de función, puede instalar:
Y úsalo como:
¡Para obtener una barra de progreso genial!
Descargo de responsabilidad: soy el autor de alive_progress, pero debería resolver su problema muy bien. Lea la documentación en https://github.com/rsalmei/alive-progress , aquí hay un ejemplo de lo que puede hacer:
fuente
Realmente me gusta la barra de progreso de Python , ya que es muy simple de usar.
Para el caso más simple, es solo:
La apariencia se puede personalizar y puede mostrar el tiempo restante estimado. Por ejemplo, use el mismo código que el anterior pero con:
fuente
Si es un gran bucle con una cantidad fija de iteraciones que está tomando mucho tiempo, puede usar esta función que hice. Cada iteración del ciclo agrega progreso. Donde count es la iteración actual del bucle, total es el valor al que está haciendo el bucle y el tamaño (int) es qué tan grande quiere la barra en incrementos de 10, es decir (tamaño 1 = 10 caracteres, tamaño 2 = 20 caracteres)
ejemplo:
salida:
fuente
Use esta biblioteca:
fish
( GitHub ).Uso:
¡Que te diviertas!
fuente
El siguiente código es una solución bastante general y también tiene un tiempo transcurrido y el tiempo restante estimado. Puede usar cualquier iterable con él. La barra de progreso tiene un tamaño fijo de 25 caracteres, pero puede mostrar actualizaciones en pasos del 1% utilizando caracteres de bloque completo, medio y cuarto. El resultado se ve así:
Código con ejemplo:
Se agradecen las sugerencias de mejoras u otros comentarios. ¡Salud!
fuente
Me gusta esta página .
Comienza con un ejemplo simple y pasa a una versión multiproceso. Funciona fuera de la caja. No se requieren paquetes de terceros.
El código se verá así:
O aquí hay un ejemplo para usar hilos para ejecutar la barra de carga giratoria mientras se ejecuta el programa:
fuente
Es bastante sencillo en Python3:
fuente
Cuando se ejecuta en portátiles jupyter, el uso de tqdm normal no funciona, ya que escribe la salida en varias líneas. Use esto en su lugar:
fuente
Si su trabajo no se puede dividir en fragmentos medibles, puede llamar a su función en un nuevo hilo y determinar cuánto tiempo lleva:
Obviamente, puede aumentar la precisión de sincronización según sea necesario.
fuente
Me gusta la respuesta de Gabriel , pero la cambié para que sea flexible. Puede enviar la longitud de la barra a la función y obtener su barra de progreso con la longitud que desee. Y no puede tener una barra de progreso con longitud cero o negativa. Además, puede usar esta función como respuesta de Gabriel (Mire el Ejemplo # 2).
Resultado:
fuente
Usé el
format()
método para hacer una barra de carga. Aquí está mi solución:Salida:
fuente
Aquí hay una solución corta que construye la barra de carga mediante programación (debe decidir cuánto tiempo la quiere).
fuente
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á:
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
También puedes usar enlighten . La principal ventaja es que puede iniciar sesión al mismo tiempo sin sobrescribir su barra de progreso.
También maneja múltiples barras de progreso.
fuente
¡Usa la biblioteca de progreso !
Aquí hay una subclase personalizada que escribí para formatear los tiempos ETA / Transcurridos en un formato mejor legible:
fuente
Esta es mi solución simple:
fuente
Debe vincular la barra de progreso a la tarea en cuestión (para que mida el progreso: D). Por ejemplo, si está enviando un archivo por FTP, puede decirle a ftplib que tome un búfer de cierto tamaño, digamos 128K, y luego agregue a su barra de progreso cualquier porcentaje del tamaño de archivo de 128k. Si está utilizando la CLI y su medidor de progreso tiene 20 caracteres, agregará un carácter cuando se haya transferido 1/20 del archivo.
fuente
@Massagran: Funciona bien en mis programas. Además, necesitamos agregar un contador para indicar los tiempos de bucle. Este contador juega como argumento del método
update
. Por ejemplo: lea todas las líneas de un archivo de prueba y trátelas en algo. Suponga que la funcióndosth()
no concierne en la variablei
.La variable
i
controla el estado apbar
través del métodoupdate
fuente
una respuesta un poco más genérica de jelde015 (crédito para él, por supuesto)
para actualizar la barra de carga manualmente será:
y llamándolo por:
resultará:
solo llámalo cuando quieras con el actual
i
valor .establecer
size
como el número de caracteres que debe ser la barrafuente
Supongo que llego un poco tarde, pero esto debería funcionar para las personas que trabajan con las versiones actuales de python 3 , ya que utiliza "cadenas f" , como se introdujo en Python 3.6 PEP 498 :
Código
Ejemplo
Salida
fuente
Esta es una manera simple de crear una barra de progreso
fuente