Comment utiliser une barre de progression lorsque mon script effectue une tâche susceptible de prendre du temps?
Par exemple, une fonction qui prend un certain temps à terminer et qui revient True
lorsqu'elle est terminée. Comment afficher une barre de progression pendant l'exécution de la fonction?
Notez que j'ai besoin que cela soit en temps réel, donc je ne sais pas quoi faire à ce sujet. Ai-je besoin d'un thread
pour cela? Je n'ai aucune idée.
Pour le moment, je n'imprime rien pendant l'exécution de la fonction, mais une barre de progression serait bien. Je suis également plus intéressé par la façon dont cela peut être fait du point de vue du code.
Réponses:
Il existe des bibliothèques spécifiques ( comme celle-ci ici ) mais peut-être que quelque chose de très simple ferait l'affaire:
Remarque: progressbar2 est un fork de progressbar qui n'a pas été maintenu depuis des années.
la source
NameError: name 'xrange' is not defined
erreur. Suis-je absent d'un module?xrange
est Python 3range
.print('■', end='', flush=True)
Avec tqdm, vous pouvez ajouter un indicateur de progression à vos boucles en une seconde:
De plus, il existe une version graphique de tqdm depuis
v2.0.0
(d977a0c
):Mais soyez prudent, car
tqdm_gui
peut déclencher unTqdmExperimentalWarning: GUI is experimental/alpha
, vous pouvez l'ignorer en utilisantwarnings.simplefilter("ignore")
, mais il ignorera tous les avertissements dans votre code après cela.la source
__len__
propriété ou l'utilisateur doit fournir l'total
argument àtqdm
. Sinon, la barre fonctionnera mais sans ETA.from tqdm import tqdm_notebook as tqdm
. Sinon, ne l'écrit pas sur une seule ligne.Les suggestions ci-dessus sont assez bonnes, mais je pense que la plupart des gens veulent juste une solution prête à l'emploi, sans dépendances sur les packages externes, mais est également réutilisable.
J'ai obtenu les meilleurs points de tout ce qui précède, et en ai fait une fonction, avec des cas de test.
Pour l'utiliser, copiez simplement les lignes sous "def update_progress (progress)" mais pas le script de test. N'oubliez pas d'importer sys. Appelez cela chaque fois que vous devez afficher ou mettre à jour la barre de progression.
Cela fonctionne en envoyant directement le symbole "\ r" à la console pour ramener le curseur au début. "print" en python ne recongise pas le symbole ci-dessus à cet effet, donc nous avons besoin de "sys"
Voici ce que montre le résultat du script de test (la dernière barre de progression s'anime):
la source
in range(101)
non 100, la progression s'arrête à 99% et ne s'affiche jamais.Cette réponse ne repose pas sur des packages externes , je pense également que la plupart des gens veulent juste un morceau de code prêt à l'emploi . Le code ci-dessous peut être adapté à vos besoins en personnalisant: symbole de progression de la
'#'
barresize
, barre , texteprefix
etc.Usage:
Production:
Ne nécessite pas de deuxième thread . Certaines solutions / packages ci-dessus nécessitent. Un deuxième thread peut être un problème
jupyter notebook
, par exemple pour a.Fonctionne avec tout itérable, cela signifie tout ce qui
len()
peut être utilisé. Alist
, undict
de n'importe quoi par exemple['a', 'b', 'c' ... 'g']
Vous pouvez également modifier la sortie en changeant le fichier
sys.stderr
par exemplela source
TypeError: object of type 'generator' has no len()
generators
) vous devez l'envelopper avec unlist()
. J'aimefor i in progressbar(list(your_generator), "Computing: ", 40):
pour une application similaire (en gardant une trace de la progression dans une boucle) j'ai simplement utilisé la barre de progression python :
Leur exemple va quelque chose comme ça,
la source
progressbar2
package. Le code ci-dessus fonctionnera avec lui.import *
?Essayez la progression depuis https://pypi.python.org/pypi/progress .
Le résultat sera une barre comme celle-ci:
la source
progress
fait de belles barres, mais il échoue si d'autres logiciels manipulentstderr
. désolé, mais je n'ai pas enquêté sur le problème exact.Je viens de créer une classe de progression simple pour mes besoins après avoir recherché ici une solution équivalente. J'ai pensé que je pourrais bien le poster.
Exemple :
Imprime ce qui suit:
[======== ] 17/80 ( 21%) 63 to go
la source
progress.current
incrémentation à la fin de__call__
pour limiter encore plus l'interaction avec l'objet du code principal.J'aime la réponse de Brian Khuu pour sa simplicité et ne pas avoir besoin de packages externes. Je l'ai un peu changé donc j'ajoute ma version ici:
Cela prend le nombre total de runs (
total
) et le nombre de runs traités jusqu'à présent (progress
) en supposanttotal >= progress
. Le résultat ressemble à ceci:la source
Vous pouvez utiliser tqdm :
Dans cet exemple, la barre de progression s'exécute pendant 5 minutes et elle s'affiche comme suit:
Vous pouvez le modifier et le personnaliser à votre guise.
la source
Pour utiliser n'importe quel cadre de barre de progression de manière utile, c'est-à-dire pour obtenir un pourcentage de progression réel et un ETA estimé, vous devez être en mesure de déclarer le nombre d'étapes qu'il aura.
Donc, votre fonction de calcul dans un autre thread, pouvez-vous la diviser en plusieurs étapes logiques? Pouvez-vous modifier son code?
Vous n'avez pas besoin de le refactoriser ou de le diviser en méthodes réelles, vous pouvez simplement mettre des stratégies
yield
à certains endroits à l'intérieur! Si la fonction coûteuse a une boucle for , il suffit d'en mettre une. Vous ne devez savoir qu'à la fin combien de rendements seront réalisés, pour obtenir les meilleurs résultats.De cette façon, votre fonction pourrait ressembler à ceci:
ou ca:
Avec ce genre de fonction, vous pouvez installer:
Et utilisez-le comme:
Pour obtenir une barre de progression sympa!
Avertissement: je suis l'auteur de alive_progress, mais cela devrait bien résoudre votre problème. Lisez la documentation sur https://github.com/rsalmei/alive-progress , voici un exemple de ce qu'il peut faire:
la source
J'aime vraiment la barre de progression python , car elle est très simple à utiliser.
Pour le cas le plus simple, c'est juste:
L'aspect peut être personnalisé et il peut afficher le temps restant estimé. Pour un exemple, utilisez le même code que ci-dessus mais avec:
la source
Si c'est une grosse boucle avec un nombre fixe d'itérations qui prend beaucoup de temps, vous pouvez utiliser cette fonction que j'ai faite. Chaque itération de boucle ajoute de la progression. Où count est l'itération actuelle de la boucle, total est la valeur vers laquelle vous bouclez et la taille (int) est la taille que vous voulez pour la barre par incréments de 10, c'est-à-dire (taille 1 = 10 caractères, taille 2 = 20 caractères)
exemple:
production:
la source
Utilisez cette bibliothèque:
fish
( GitHub ).Usage:
S'amuser!
la source
Le code ci-dessous est une solution assez générale et a également une estimation du temps écoulé et du temps restant. Vous pouvez utiliser n'importe quel itérable avec lui. La barre de progression a une taille fixe de 25 caractères, mais elle peut afficher les mises à jour par étapes de 1% en utilisant des caractères de bloc complet, demi et quart de bloc. La sortie ressemble à ceci:
Code avec exemple:
Des suggestions d'amélioration ou d'autres commentaires sont appréciés. À votre santé!
la source
J'aime cette page .
Commence par un exemple simple et passe à une version multi-thread. Fonctionne hors de la boîte. Aucun forfait tiers n'est requis.
Le code ressemblera à ceci:
Ou voici un exemple d'utilisation de threads afin d'exécuter la barre de chargement en rotation pendant l'exécution du programme:
la source
C'est assez simple en Python3:
la source
Lors de l'exécution dans des blocs-notes jupyter, l'utilisation de tqdm normal ne fonctionne pas, car il écrit la sortie sur plusieurs lignes. Utilisez-le à la place:
la source
Si votre travail ne peut pas être décomposé en morceaux mesurables, vous pouvez appeler votre fonction dans un nouveau thread et chronométrer combien de temps cela prend:
Vous pouvez évidemment augmenter la précision de synchronisation au besoin.
la source
J'aime la réponse de Gabriel , mais je l'ai changé pour être flexible. Vous pouvez envoyer une longueur de barre à la fonction et obtenir votre barre de progression avec la longueur que vous souhaitez. Et vous ne pouvez pas avoir de barre de progression avec une longueur nulle ou négative. En outre, vous pouvez utiliser cette fonction comme la réponse de Gabriel (regardez l'exemple # 2).
Résultat:
la source
J'ai utilisé la
format()
méthode pour créer une barre de charge. Voici ma solution:Production:
la source
Voici une courte solution qui construit la barre de chargement par programme (vous devez décider combien de temps vous le souhaitez).
la source
Essayez PyProg. PyProg est une bibliothèque open-source pour Python pour créer des indicateurs de progression et des barres super personnalisables.
Il est actuellement à la version 1.0.2; il est hébergé sur Github et disponible sur PyPI (liens ci-dessous). Il est compatible avec Python 3 & 2 et peut également être utilisé avec Qt Console.
C'est vraiment simple à utiliser. Le code suivant:
produira:
J'ai fait PyProg parce que j'avais besoin d'une bibliothèque de barre de progression simple mais super personnalisable. Vous pouvez facilement l' installer avec:
pip install pyprog
.PyProg Github: https://github.com/Bill13579/pyprog
PyPI: https://pypi.python.org/pypi/pyprog/
la source
Vous pouvez également utiliser enlighten . Le principal avantage est que vous pouvez vous connecter en même temps sans écraser votre barre de progression.
Il gère également plusieurs barres de progression.
la source
Utilisez la bibliothèque de progression !
Voici une sous-classe personnalisée que j'ai écrite pour formater les temps ETA / Elapsed dans un format mieux lisible:
la source
Voici ma solution simple:
la source
Vous devez lier la barre de progression à la tâche en cours (afin qu'elle mesure la progression: D). Par exemple, si vous transférez un fichier par FTP, vous pouvez dire à ftplib de récupérer une certaine taille de tampon, disons 128 Ko, puis vous ajoutez à votre barre de progression le pourcentage de la taille de fichier que 128 Ko représente. Si vous utilisez l'interface CLI et que votre indicateur de progression comporte 20 caractères, vous ajouterez un caractère lorsque 1 / 20e du fichier aura été transféré.
la source
@Massagran: Cela fonctionne bien dans mes programmes. De plus, nous devons ajouter un compteur pour indiquer les temps de boucle. Ce compteur joue comme argument de la méthode
update
. Par exemple: lisez toutes les lignes d'un fichier de test et traitez-les sur quelque chose. Supposons que la fonctiondosth()
ne concerne pas la variablei
.La variable
i
contrôle l'état depbar
via la méthodeupdate
la source
une réponse un peu plus générique de jelde015 (crédit à lui bien sûr)
pour mettre à jour la barre de chargement manuellement sera:
et en l'appelant par:
résultera:
il suffit de l'appeler à tout moment avec la
i
valeur actuelle .définir le
size
nombre de caractères que la barre doit êtrela source
Je suppose que je suis un peu en retard, mais cela devrait fonctionner pour les personnes travaillant avec les versions actuelles de python 3 , car cela utilise des "f-strings" , comme introduit dans Python 3.6 PEP 498 :
Code
Exemple
Production
la source
C'est un moyen simple de créer une barre de progression
la source