Declaraciones impresas en tiempo real con camiseta en escritura interactiva

Declaraciones impresas en tiempo real con camiseta en escritura interactiva

Tengo un programa long_interactive_script.pyque tiene miles de printdeclaraciones. Quiero canalizar el programa tee(o una alternativa) para poder guardar el resultado.

Si lo hago

long_interactive_script.py | tee logfile.txt

Python coloca sus declaraciones impresas en un búfer de 4K, lo que me hace obtener:

¡nada, nada, nada, nada, mucho texto!, nada, nada, un mensaje sudo en medio de una palabra, nada, nada, ¡mucho texto!

En un intento de evitar el búfer, probé:

unbuffer long_interactive_script.py | tee logfile.txt

Pero esto hace que mi script deje de ser interactivo. Entonces, cuando el guión se rompe en unsudopronto, se detiene.

Nota: No puedo simplemente sudoANTES de ejecutar el script. El script interactivo solo requiere sudoalgunas ejecuciones y no quiero solicitarlo sudocuando no es necesario.

Más...

stdbuf -oL long_interactive_script.py | tee -a logfile.txt

funciona hasta cierto punto. Obtengo todos los datos deseados, pero también aparece este error:

ERROR: ld.so: object '/usr/lib64/coreutils/libstdbuf.so' from LD_PRELOAD cannot be preloaded: ignored.

Respuesta1

Especifique un búfer de tamaño cero para el flujo de salida estándar de Python. Puede hacer esto invocando Python con la -ubandera o con la siguiente declaración.

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

Respuesta2

A pesar de las soluciones alternativas para el almacenamiento en búfer, es por eso que otros usanscript, que captura todos los caracteres escritos en el terminal sin interferir con las indicaciones interactivas.

El archivo resultante typescriptes un poco más feo que simplemente redirigir a la salida estándar, pero (suponiendo que su aplicación estuviera proporcionando información útil en ese modo), bastará con recortar los caracteres de retorno de carro.

Más allá de los retornos de carro, hay caracteres de edición que filtrar. Ver por ejemplo:

información relacionada