
Tengo un programa long_interactive_script.py
que tiene miles de print
declaraciones. 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 sudo
ANTES de ejecutar el script. El script interactivo solo requiere sudo
algunas ejecuciones y no quiero solicitarlo sudo
cuando 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 -u
bandera 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 typescript
es 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: