2010-04-22 9 views
5

El programa My Python hace una serie de cosas e imprime algunos resultados de diagnóstico. También me gustaría tener un contador de progreso como este:¿Cómo simulo un contador de progreso en una aplicación de línea de comando en Python?

Percentage done: 25% 

donde el número aumenta "en su lugar". Si utilizo solo declaraciones de cadenas, puedo escribir números separados, pero eso llenaría la pantalla. ¿Hay alguna forma de lograr esto, por ejemplo, utilizando algún tipo de escape para retroceso para borrar un número y escribir el siguiente?

Gracias

+0

Es dependiente de la plataforma –

+0

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

Respuesta

7

Aquí se muestra un ejemplo para mostrar el archivo de porcentage:

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 solución del pobre: ​​

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

El truco es la declaración de impresión. El retorno de carro ("\ r") devuelve el cursor a la primera columna en la misma línea, sin iniciar una nueva línea. La coma final "," le dice a la impresión que no produzca una nueva línea tampoco.

Dependiendo de su resultado, puede rellenar la instrucción de impresión con espacios finales para garantizar que los fragmentos de las líneas anteriores más largas no interfieran con su estado de impresión actual. Probablemente sea mejor ensamblar una cadena que tenga longitud fija para cualquier información de progreso.

+1

zoli2k es correcto. Debes llamar a stdout.flush() para obtener una lectura en tiempo real. – Bernd

0

Aquí hay una muy simple clase de barra de progreso que encapsula la mayor parte de lo que se quiere hacer con una barra de progreso de la CLI (sin 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] 
Cuestiones relacionadas