2010-04-22 4 views
5

Il mio programma Python esegue una serie di operazioni e stampa alcuni output diagnostici. Mi piacerebbe anche avere un contatore dei progressi come questo:Come simulare un contatore di avanzamento in un'applicazione della riga di comando in Python?

dove il numero aumenta "sul posto". Se uso solo le dichiarazioni di stringa, posso scrivere numeri separati, ma questo potrebbe ingombrare lo schermo. C'è un modo per ottenere questo, per esempio usando un escape char per backspace per cancellare un numero e scrivere quello successivo?

Grazie

+0

E 'dipendente dalla piattaforma –

+0

possibile duplicato di http://stackoverflow.com/questions/60221/how-to-animate-the-command-line – SilentGhost

risposta

7

Ecco un esempio per mostrare il file percentuale leggere:

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

Soluzione scadente:

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

Il trucco è la dichiarazione di stampa. Il ritorno a capo ("\ r") riporta il cursore alla prima colonna sulla stessa riga, senza iniziare una nuova riga. La virgola finale "," dice a stampa di non produrre neanche una nuova riga.

A seconda dell'output, è possibile eseguire il rilievo dell'istruzione di stampa con spazi finali per garantire che i frammenti delle righe precedenti non interferiscano con l'istruzione di stampa corrente. Probabilmente è meglio assemblare una stringa che abbia una lunghezza fissa per qualsiasi informazione sul progresso.

+1

zoli2k è giusto. Devi chiamare stdout.flush() per ottenere una lettura in tempo reale. – Bernd

0

Ecco una molto semplice classe Barra di avanzamento che incapsula la maggior parte di quello che ci si vuole fare con una barra di avanzamento CLI (senza la barra).

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] 
Problemi correlati