193 votes

tqdm dans Jupyter Notebook imprime les nouvelles barres de progression de manière répétée

J'utilise tqdm pour imprimer la progression dans un script Je m'exécute dans un carnet Jupyter. J'imprime tous les messages sur la console via tqdm.write() . Cependant, cela me donne toujours un résultat faussé comme celui-ci :

enter image description here

C'est-à-dire que chaque fois qu'une nouvelle ligne doit être imprimée, une nouvelle barre de progression est imprimée sur la ligne suivante. Cela ne se produit pas lorsque j'exécute le script via le terminal. Comment puis-je résoudre ce problème ?

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/

305voto

oscarbranson Points 1241

Essayez d'utiliser tqdm.notebook.tqdm au lieu de tqdm comme indiqué aquí .

Cela peut être aussi simple que de changer votre importation :

from tqdm.notebook import tqdm

Bonne chance !

EDITAR: Après test, il semble que tqdm fonctionne en fait très bien en "mode texte" dans le carnet Jupyter. C'est difficile à dire parce que vous n'avez pas fourni un numéro d'identification de l'utilisateur. exemple minimal mais il semble que votre problème soit causé par une instruction print dans chaque itération. L'instruction print sort un nombre (~0.89) entre chaque mise à jour de la barre d'état, ce qui perturbe la sortie. Essayez de supprimer l'instruction print.

2 votes

Je n'ai pas utilisé de print() j'ai utilisé tqdm.write() . Cependant, tqdm_notebook donne de bons résultats. Merci : )

0 votes

Savez-vous s'il supporte Python 3.6 ? Je n'ai pas eu de chance avec cela

1 votes

Quelle erreur obtenez-vous ? Cela fonctionne bien pour moi. Impossible d'aider avec si peu d'informations... Avez-vous activé ipywidgets dans jupyer ? Avez-vous tout simplement tqdm plutôt que tqdm_notebook ? Cela fonctionne bien avec Python 3.6 et Jupyter 1.0.0.

48voto

de1 Points 1162

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

Une alternative est d'utiliser ceci progressbar stackoverflow.com/a/34482761/1207193

0 votes

C'est de loin la meilleure réponse.

33voto

La plupart des réponses sont maintenant dépassées. Il est préférable d'importer tqdm correctement.

from tqdm import tqdm_notebook as tqdm

enter image description here

17 votes

Il a encore changé : TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0 Please use tqdm.notebook.tqdm instead of tqdm.tqdm_notebook

16voto

Julio Cezar Silva Points 456

Si les autres conseils donnés ici ne fonctionnent pas et que, comme moi, vous utilisez l'application pandas l'intégration par progress_apply vous pouvez laisser tqdm le gérer :

from tqdm.autonotebook import tqdm
tqdm.pandas()

df.progress_apply(row_function, axis=1)

Le point essentiel ici réside dans le tqdm.autonotebook module. Comme indiqué dans leurs instructions pour l'utilisation dans les Notebooks IPython ce qui fait que tqdm choisir entre les formats de barre de progression utilisés dans les carnets Jupyter et les consoles Jupyter - pour une raison qui n'a pas encore fait l'objet d'investigations plus poussées de ma part, le format spécifique choisi par tqdm.autonotebook fonctionne sans problème dans pandas alors que tous les autres ne l'ont pas fait, pour progress_apply spécifiquement.

16voto

mjarosie Points 1290

Pour compléter la réponse d'oscarbranson : il est possible de choisir automatiquement les versions console ou notebook de la barre de progression en fonction de l'endroit d'où elle est exécutée :

from tqdm.autonotebook import tqdm

Plus d'informations sont disponibles aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X