Ceci est une réponse alternative au cas où tqdm_notebook ne fonctionne pas pour vous.
Compte tenu de l'exemple suivant:
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)
La sortie ressemblerait à quelque chose comme ceci (la progression apparaîtrait en rouge):
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
Le problème est que la sortie vers stdout et stderr est traitée de manière asynchrone et séparément en termes de nouvelles lignes.
Si, par exemple, Jupyter reçoit sur stderr la première ligne, puis la sortie "traitée" sur stdout. Ensuite, une fois qu'il reçoit une sortie sur stderr pour mettre à jour la progression, il ne reviendra pas et met à jour la première ligne car il ne mettra à jour que la dernière ligne. Au lieu de cela, il devra écrire une nouvelle ligne.
Solution de contournement 1, écriture sur stdout
Une solution de contournement serait de générer les deux vers stdout à la place:
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 sortie passera à (plus de rouge):
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]
Ici, nous pouvons voir que Jupyter ne semble pas s'éclaircir avant la fin de la ligne. Nous pourrions ajouter une autre solution de contournement pour cela en ajoutant des espaces. Tel que:
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)
Ce qui nous donne:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Solution de contournement 2, définissez plutôt la description
Il peut en général être plus simple de ne pas avoir deux sorties mais de mettre à jour la description à la place, par exemple:
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)
Avec la sortie (description mise à jour pendant son traitement):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Conclusion
Vous pouvez généralement le faire fonctionner correctement avec tqdm ordinaire. Mais si tqdm_notebook fonctionne pour vous, utilisez-le simplement (mais vous ne lirez probablement pas aussi loin).
tqdm_notebook
, je peux même faire desprint
s normales , et cela n'affecte pas la barre de progression.