Esta es una respuesta alternativa para el caso donde tqdm_notebook no funciona para usted.
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 stdout y stderr se procesan de forma asíncrona y por separado en términos de nuevas líneas.
Si digamos, 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 volvería y actualizaría la primera línea, ya que solo actualizaría 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 generar ambos en 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 despejarse 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 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 está procesando):
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_notebook funciona para usted, solo use eso (pero probablemente no leería tan lejos).
tqdm_notebook
, incluso puedo hacerprint
s normales , y no afecta la barra de progreso.