Esta é uma resposta alternativa para o caso em que tqdm_notebook não funciona para você.
Dado o seguinte exemplo:
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)
A saída seria mais ou menos assim (o progresso seria exibido em vermelho):
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
O problema é que a saída para stdout e stderr é processada de forma assíncrona e separada em termos de novas linhas.
Se, por exemplo, o Jupyter recebe no stderr a primeira linha e a saída "processada" no stdout. Então, uma vez que ele recebe uma saída no stderr para atualizar o progresso, ele não volta e atualiza a primeira linha, pois atualiza apenas a última linha. Em vez disso, terá que escrever uma nova linha.
Solução alternativa 1, gravando no stdout
Uma solução alternativa seria produzir ambos para stdout:
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)
A saída mudará para (não mais vermelho):
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]
Aqui podemos ver que Jupyter parece não estar limpo até o final da linha. Poderíamos adicionar outra solução alternativa para isso adicionando espaços. Tal 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)
O que nos dá:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Solução 2, defina a descrição em vez disso
Em geral, pode ser mais direto não ter duas saídas, mas atualizar a descrição, por exemplo:
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)
Com a saída (descrição atualizada durante o processamento):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Conclusão
Você pode fazê-lo funcionar bem com o tqdm comum. Mas se o tqdm_notebook funcionar para você, use-o (mas você provavelmente não leria até agora).
tqdm_notebook
, posso fazerprint
s normais , e isso não afeta a barra de progresso.