Pour implémenter une barre d'état comme ci-dessous:
[========== ] 45%
[================ ] 60%
[==========================] 100%
Je veux que cela soit imprimé sur stdout, et continuer à le rafraîchir, pas imprimer sur une autre ligne. Comment faire cela?
Réponses:
Il existe un module Python que vous pouvez obtenir de PyPI appelé
progressbar
qui implémente une telle fonctionnalité. Si cela ne vous dérange pas d'ajouter une dépendance, c'est une bonne solution. Sinon, optez pour l'une des autres réponses.Un exemple simple de son utilisation:
Pour l'installer, vous pouvez utiliser
easy_install progressbar
, oupip install progressbar
si vous préférez pip.la source
bar.start()
?bar.start()
sudo -H pip install progressbar2
.Le
'\r'
caractère (retour chariot) remet le curseur au début de la ligne et vous permet d'écrire sur ce qui était auparavant sur la ligne.Je ne suis pas sûr à 100% si cela est complètement portable sur tous les systèmes, mais cela fonctionne au moins sous Linux et OSX.
la source
n=21
, remplacerrange(21)
avecrange(n)
, puis ajouterj = (i + 1) / n
dans la boucle, et remplacer lawrite
déclaration avec cette légère modification:sys.stdout.write("[%-20s] %d%%" % ('='*int(20*j), 100*j))
. Maintenant, le seul changement que vous devez faire est de fairen=21
avant la boucle (plus probablementn=len(iterable)
), puis d'énumérer sur l'objet itérable. J'ai recommandé cette modification mais elle a été rejetée; apparemment, la fonctionnalité "s'écarte de l'intention originale du message".sys.stdout.write("[{:{}}] {:.1f}%".format("="*i, n-1, (100/(n-1)*i)))
,, Python 3 uniquementJ'ai trouvé la bibliothèque utile tqdm ( https://github.com/tqdm/tqdm/ , précédemment: https://github.com/noamraph/tqdm ). Il estime automatiquement le temps d'achèvement et peut être utilisé comme itérateur.
Usage:
Résulte en:
tqdm
peut envelopper tout itérable.la source
Vous pouvez utiliser
\r
( retour chariot ). Démo:la source
total
tant que10
, puis vous obtenez un message d'erreurZeroDivisionError: long division or modulo by zero
Ici, vous pouvez utiliser le code suivant comme fonction:
Avec l'utilisation de .format:
la source
] percent * 100 %
sur la base des réponses ci-dessus et d'autres questions similaires sur la barre de progression de la CLI, je pense avoir obtenu une réponse générale commune à toutes. Vérifiez-le sur https://stackoverflow.com/a/15860757/2254146
Voici une copie de la fonction, mais modifiée pour s'adapter à votre style:
Ressemble à
Pourcentage: [====================] 99,0%
la source
Si vous développez une interface de ligne de commande, je vous suggère de jeter un œil à
click
ce qui est très agréable:Voici la sortie que vous obtenez:
la source
Amélioration supplémentaire, en utilisant une fonction comme:
exemple d'appel:
production:
la source
Je suis tombé sur ce fil aujourd'hui et après avoir essayé cette solution de Mark Rushakoff
Je peux dire que cela fonctionne bien sur W7-64 avec python 3.4.3 64 bits mais uniquement dans la console native. Cependant, lors de l'utilisation de la console intégrée de spyder 3.0.0dev, les sauts de ligne sont toujours / à nouveau présents. Comme cela m'a pris un certain temps à comprendre, j'aimerais signaler cette observation ici.
la source
En me basant sur certaines des réponses ici et ailleurs, j'ai écrit cette fonction simple qui affiche une barre de progression et le temps restant écoulé / estimé. Devrait fonctionner sur la plupart des machines basées sur unix.
la source
C'est une approche assez simple qui peut être utilisée avec n'importe quelle boucle.
la source
Le plus simple est encore
La clé est de convertir le type entier en chaîne.
la source
Comme décrit dans la solution de Mark Rushakoff , vous pouvez afficher le caractère de retour chariot,,
sys.stdout.write('\r')
pour réinitialiser le curseur au début de la ligne. Pour généraliser cette solution, tout en implémentant les f-Strings de Python 3 , vous pouvez utiliserla source
Essayez PyProg. PyProg est une bibliothèque open-source pour Python permettant de créer des indicateurs et des barres de progression 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 il peut également être utilisé avec Qt Console.
C'est vraiment facile à utiliser. Le code suivant:
produira exactement ce que vous voulez (même la longueur de la barre!):
Pour plus d'options pour personnaliser la barre de progression, accédez à la page Github de ce site Web.
J'ai en fait créé PyProg parce que j'avais besoin d'une bibliothèque de barres 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
En utilisant la réponse @ Mark-Rushakoff, j'ai élaboré une approche plus simple, pas besoin d'appeler la bibliothèque sys. Il fonctionne avec Python 3. Testé sous Windows:
la source
print
existe un wrapper léger qui formate l'entrée et appelle la fonction d'écriture d'un objet donné. Par défaut, cet objet estsys.stdout
.Voici quelque chose que j'ai fait en utilisant la solution de @ Mark-Rushakoff. Pour s'adapter de manière adaptative à la largeur du terminal.
la source