tqdm en Jupyter Notebook imprime nuevas barras de progreso repetidamente

6 minutos de lectura

avatar de usuario
Rohan Saxena

estoy usando tqdm para imprimir el progreso en un script que estoy ejecutando en un cuaderno Jupyter. Estoy imprimiendo todos los mensajes a la consola a través de tqdm.write(). Sin embargo, esto todavía me da una salida sesgada como esta:

ingrese la descripción de la imagen aquí

Es decir, cada vez que se tiene que imprimir una nueva línea, se imprime una nueva barra de progreso en la siguiente línea. Esto no sucede cuando ejecuto el script a través de la terminal. ¿Como puedo resolver esto?

  • En realidad, cuando uso tqdm_notebookincluso puedo hacer normal prints, y no afecta la barra de progreso.

    – Tomasz Gandor

    11 de marzo de 2019 a las 19:56

  • una alternativa es usar este progressbar stackoverflow.com/questions/3160699/python-progress-bar/…

    – iambr

    8 de octubre de 2019 a las 14:12


  • Compruebe también: github.com/tqdm/tqdm/issues/375

    – Memristor

    31 de enero a las 20:07

avatar de usuario
oscarbrason

Intenta usar tqdm.notebook.tqdm en vez de tqdmcomo se indica aquí.

Esto podría ser tan simple como cambiar su importación a:

from tqdm.notebook import tqdm

¡Buena suerte!

EDITAR: Después de la prueba, parece que tqdm en realidad funciona bien en ‘modo de texto’ en el cuaderno Jupyter. Es difícil saberlo porque no proporcionó un ejemplo mínimo, pero parece que su problema se debe a una declaración de impresión en cada iteración. La declaración de impresión está generando un número (~0.89) entre cada actualización de la barra de estado, lo que está arruinando la salida. Intente eliminar la declaración de impresión.

  • no he usado un print() declaración, usé tqdm.write(). Sin embargo, tqdm_notebook da buenos resultados. Gracias : )

    – Rohan Saxena

    14 de febrero de 2017 a las 9:00

  • ¿Sabes si es compatible con Python 3.6? no he tenido suerte con esto

    – Jon

    8 oct 2017 a las 17:59

  • ¿Qué error estás recibiendo? Funciona bien para mí. Imposible ayudar con tan poca información… ¿Tienes ipywidgets habilitados en jupyer? ¿Tienes simplemente tqdmmás bien que tqdm_notebook? Esto funciona bien con Python 3.6 y Jupyter 1.0.0.

    – oscarbranson

    10 de octubre de 2017 a las 3:11


  • tqdm_notebook de tqdm 4.19.4 me funciona en Python 3.6, Jupyter notebook 5.0.0 e ipywidgets 7.0.3.

    –Matt Kleinsmith

    31/10/2017 a las 21:50


  • Esta parece ser la forma más fácil: from tqdm.autonotebook import tqdm

    – Iofeam

    3 de noviembre de 2020 a las 15:43


avatar de usuario
de1

Esta es una respuesta alternativa para el caso en que tqdm_cuaderno no funciona para ti

Dado el siguiente ejemplo:

from time import sleep
from tqdm import tqdm

values = range(3)
with tqdm(total=len(values)) as pbar:
    for i in values:
        pbar.write('processed: %d' %i)
        pbar.update(1)
        sleep(1)

El resultado se vería así (el progreso se mostraría en rojo):

  0%|          | 0/3 [00:00<?, ?it/s]
processed: 1
 67%|██████▋   | 2/3 [00:01<00:00,  1.99it/s]
processed: 2
100%|██████████| 3/3 [00:02<00:00,  1.53it/s]
processed: 3

El problema es que la salida a salida estándar y estándar se procesan de forma asíncrona y por separado en términos de nuevas líneas.

Si dice que Jupyter recibe en stderr la primera línea y luego la salida “procesada” en stdout. Luego, una vez que recibe una salida en stderr para actualizar el progreso, no regresará y actualizará la primera línea, ya que solo actualizará la última línea. En su lugar, tendrá que escribir una nueva línea.

Solución 1, escribir en stdout

Una solución alternativa sería enviar ambos a stdout en su lugar:

import sys
from time import sleep
from tqdm import tqdm

values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
    for i in values:
        pbar.write('processed: %d' % (1 + i))
        pbar.update(1)
        sleep(1)

La salida cambiará a (no más rojo):

processed: 1   | 0/3 [00:00<?, ?it/s]
processed: 2   | 0/3 [00:00<?, ?it/s]
processed: 3   | 2/3 [00:01<00:00,  1.99it/s]
100%|██████████| 3/3 [00:02<00:00,  1.53it/s]

Aquí podemos ver que Jupyter no parece borrarse hasta el final de la línea. Podríamos agregar otra solución para eso agregando espacios. Como:

import sys
from time import sleep
from tqdm import tqdm

values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
    for i in values:
        pbar.write('processed: %d%s' % (1 + i, ' ' * 50))
        pbar.update(1)
        sleep(1)

Lo que nos da:

processed: 1                                                  
processed: 2                                                  
processed: 3                                                  
100%|██████████| 3/3 [00:02<00:00,  1.53it/s]

Solución alternativa 2, establezca la descripción en su lugar

En general, podría ser más sencillo no tener dos salidas, sino actualizar la descripción, por ejemplo:

import sys
from time import sleep
from tqdm import tqdm

values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
    for i in values:
        pbar.set_description('processed: %d' % (1 + i))
        pbar.update(1)
        sleep(1)

Con la salida (descripción actualizada mientras se procesa):

processed: 3: 100%|██████████| 3/3 [00:02<00:00,  1.53it/s]

Conclusión

En su mayoría, puede hacer que funcione bien con tqdm simple. Pero si tqdm_cuaderno funciona para usted, solo use eso (pero entonces probablemente no haya leído tanto).

  • una alternativa es usar este progressbar stackoverflow.com/a/34482761/1207193

    – iambr

    10 oct 2019 a las 18:39

avatar de usuario
Shritam Kumar Mund

La mayoría de las respuestas están desactualizadas ahora. Mejor si importas tqdm correctamente.

from tqdm import tqdm_notebook as tqdm

ingrese la descripción de la imagen aquí

  • Cambió de nuevo: TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0 Please use tqdm.notebook.tqdm instead of tqdm.tqdm_notebook

    – estación

    5 de marzo de 2020 a las 4:00


Para completar la respuesta de oscarbranson: es posible elegir automáticamente las versiones de consola o portátil de la barra de progreso según desde dónde se ejecute:

from tqdm.autonotebook import tqdm

Se puede encontrar más información aquí

avatar de usuario
Julio César Silva

Si los otros consejos aquí no funcionan y, al igual que yo, estás usando el pandas integración a través progress_applypuedes dejar tqdm manejarlo:

from tqdm.autonotebook import tqdm
tqdm.pandas()

df.progress_apply(row_function, axis=1)

El punto principal aquí radica en el tqdm.autonotebook módulo. Como se indica en sus instrucciones de uso en Notebooks IPythonEsto hace tqdm elegir entre los formatos de barra de progreso utilizados en los portátiles Jupyter y las consolas Jupyter, por una razón que aún falta más investigaciones de mi parte, el formato específico elegido por tqdm.autonotebook funciona sin problemas en pandasmientras que todos los demás no lo hicieron, por progress_apply específicamente.

  • Tenga en cuenta que usando tqdm.autonotebook resulta en un TqdmExperimentalWarning ya que tqdm no sabe si es un cuaderno jupyter o una consola jupyter. Usar tqdm.auto en lugar de suprimir esto. Ver pypi.org/project/tqdm/#ipython-jupyter-integración

    – drevicko

    19 de marzo a las 23:08

Ninguno de los anteriores funciona para mí. Encuentro que ejecutar lo siguiente ordena este problema después del error (simplemente borra todas las instancias de barras de progreso en segundo plano):

from tqdm import tqdm

# blah blah your code errored

tqdm._instances.clear()

  • Tenga en cuenta que usando tqdm.autonotebook resulta en un TqdmExperimentalWarning ya que tqdm no sabe si es un cuaderno jupyter o una consola jupyter. Usar tqdm.auto en lugar de suprimir esto. Ver pypi.org/project/tqdm/#ipython-jupyter-integración

    – drevicko

    19 de marzo a las 23:08

Para todos los que están en Windows y no pudieron resolver el problema de las barras duplicadas con ninguna de las soluciones mencionadas aquí. tuve que instalar el colorama paquete como se indica en problemas conocidos de tqdm que lo arregló.

pip install colorama

Pruébalo con este ejemplo:

from tqdm import tqdm
from time import sleep

for _ in tqdm(range(5), "All", ncols = 80, position = 0):
    for _ in tqdm(range(100), "Sub", ncols = 80, position = 1, leave = False):
        sleep(0.01)

Lo que producirá algo como:

All:  60%|████████████████████████                | 3/5 [00:03<00:02,  1.02s/it]
Sub:  50%|██████████████████▌                  | 50/100 [00:00<00:00, 97.88it/s]

¿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