2010-04-22 5 views
5

Mon programme Python effectue une série de tâches et imprime une sortie de diagnostic. Je voudrais également avoir un compteur de progression comme ceci:Comment simuler un compteur de progression dans une application de ligne de commande en Python?

Percentage done: 25% 

où le nombre augmente "en place". Si j'utilise seulement des instructions de chaîne je peux écrire des nombres séparés, mais cela encombrerait l'écran. Existe-t-il un moyen d'y parvenir, en utilisant par exemple un caractère d'échappement pour le retour arrière afin d'effacer un nombre et d'écrire le suivant?

Merci

+0

il est dépendant de la plateforme –

+0

double possible de http://stackoverflow.com/questions/60221/how-to-animate-the-command-line – SilentGhost

Répondre

7

Voici un exemple pour le fichier indiquant le pourcentage suivant:

from sys import * 
import os 
import time 

Size=os.stat(argv[1])[6] #file size 

f=open(argv[1],"r"); 
READED_BYTES=0 

for line in open(argv[1]): #Read every line from the file 
     READED_BYTES+=len(line) 
     done=str(int((float(READED_BYTES)/Size)*100)) 
     stdout.write(" File read percentage: %s%%  %s"%(done,"\r")) 
     stdout.flush(); 
     time.sleep(1) 
4

La solution du pauvre:

import time 
    for i in range(10): 
    print "\r", i, 
    time.sleep(1) 

L'astuce est l'instruction d'impression. Le retour chariot ("\ r") ramène le curseur à la première colonne sur la même ligne, sans démarrer une nouvelle ligne. La virgule "," indique à l'impression de ne pas produire de nouvelle ligne non plus. En fonction de votre sortie, vous souhaiterez peut-être remplir l'instruction d'impression avec des espaces de fin pour éviter que des fragments provenant de lignes précédentes plus longues n'interfèrent avec votre instruction d'impression actuelle. Il est probablement préférable d'assembler une chaîne qui a une longueur fixe pour toute information de progression.

+1

zoli2k est juste. Vous devriez appeler stdout.flush() pour obtenir une lecture en temps réel. – Bernd

0

Voici une classe barre de progression très simple qui encapsule la plupart de ce que vous voulez faire avec une barre de progression CLI (sans la barre).

class ProgressBar(object): 
    def __init__(self, total=100, stream=sys.stderr): 
     self.total = total 
     self.stream = stream 
     self.last_len = 0 
     self.curr = 0 

    def count(self): 
     self.curr += 1 
     self.print_progress(self.curr) 

    def print_progress(self, value): 
     self.stream.write('\b' * self.last_len) 
     pct = 100 * self.curr/self.total 
     out = '{:.2f}% [{}/{}]'.format(pct, self.curr, self.total) 
     self.last_len = len(out) 
     self.stream.write(out) 
     self.stream.flush() 

E.g.

>>> p = ProgressBar(1000) 
>>> p.print_progress(500) 
50% [500/1000] 
Questions connexes