Il s'agit d'une réponse alternative pour le cas où tqdm_notebook ne fonctionne pas pour vous.
Dans 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)
Le résultat ressemblerait à 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 y stderr sont traitées de manière asynchrone et séparément en termes de nouvelles lignes.
Si disons que Jupyter reçoit sur stderr la première ligne et ensuite 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 en arrière et mettra à 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 1, écriture dans la sortie standard (stdout)
Une solution de contournement serait d'afficher les deux dans 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 devient (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'effacer avant la fin de la ligne. Nous pourrions ajouter une autre solution de contournement pour cela en ajoutant des espaces. 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.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 2, définissez la description à la place
En général, il serait 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 le traitement) :
processed: 3: 100%|| 3/3 [00:02<00:00, 1.53it/s]
Conclusion
Vous pouvez généralement le faire fonctionner correctement avec du tqdm ordinaire. Mais si tqdm_notebook vous convient, utilisez-la (mais vous ne l'auriez probablement pas lu aussi loin).
0 votes
En fait, quand j'utilise
tqdm_notebook
Je peux même le faire normalement.print
et cela n'affecte pas la barre de progression.0 votes
Une alternative est d'utiliser ceci
progressbar
stackoverflow.com/questions/3160699/python-progress-bar/