Salida en tiempo real de subprocess.popen () y no línea por línea

Actualmente estoy reescribiendo un pequeño progtwig contenedor en python que una vez escribí en C ++. Extrae archivos de un archivo y los coloca en otro formato.

En C ++, la salida de los comandos del sistema que necesito ejecutar fue “en tiempo real”, es decir, la barra de estado y el indicador de porcentaje de algunos comandos donde se muestra en tiempo real. Con python obtengo cada ‘porcentaje’ volcado en la pantalla individualmente (porque lo leo línea por línea). Aquí hay un ejemplo: así es como se ve una barra de estado en la versión de python (esto continúa hasta 100). En C ++ sí se actualiza.

| (02/100)\rImporting AVC-H264: | | (03/100)\rImporting AVC-H264: | | (04/100)\rImporting AVC-H264: |= 

Ese es el código de python correspondiente:

 p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) for line in iter(p.stdout.readline, ""): print line, 

¿Alguna idea sobre cómo podría hacer que se vea como en C ++?

Podrían ser dos cosas …

Es probable que readline esté cambiando algunas cosas de la salida de su progtwig. Creo que \r es el retorno de carro y le dice al terminal que regrese al principio de la línea y luego el progtwig puede dar salida al texto que acaba de emitir. Readline es muy probable que elimine esto.

Lo primero que debes intentar,

 p = subprocess.Popen(args, stdout=subprocess.PIPE, \ stderr=subprocess.PIPE, \ universal_newlines=True) for line in iter(p.stdout.readline, ""): sys.stdout.write('\r'+line[:-1]) sys.stdout.flush() 

Tienes que hacer el flush porque stdout almacena en búfer hasta que obtiene un \n por supuesto, no estás escribiendo uno.

En Windows, puede generar el carácter de retroceso (código ASCII 8). Ejemplo (imprime la iteración actual utilizando solo números de un solo dígito):

 >>> import time >>> import sys >>> for i in xrange(10): ... sys.stdout.write(str(i)) ... time.sleep(.5) ... sys.stdout.write(chr(8)) ... 

Necesitaría realizar un seguimiento del número de caracteres en la línea actual … Estoy seguro de que debe haber una mejor manera.

En Linux, parece que puede escribir retornos de carro para restablecer la posición del cursor. Consulte Borrar la línea actual de la consola impresa y el resultado del progreso en el lugar en el terminal o la consola .

Lo siento, pero no entendí bien la parte en tiempo real, pero tal vez pueda ayudar con la parte “actualizarla”, intente esto:

 for line in iter(p.stdout.readline, ""): print line + '\r',