Ver algo escrito en un archivo en vivo con cola

Ver algo escrito en un archivo en vivo con cola

Tengo un programa Python que, lentamente, está generando algunos resultados.

Quiero capturar eso en un archivo, pero también pensé que podría verlo en vivo con cola.

Entonces en una terminal estoy haciendo:

python myprog.py > output.txt

y en otra terminal:

tail -f output.txt

Pero parece que la cola no me muestra nada mientras se ejecuta el programa Python.

Si presiono Ctrl-c para finalizar el script de Python, de repente la cola output.txtcomienza a llenarse. Pero no mientras Python se esté ejecutando.

¿Qué estoy haciendo mal?

Respuesta1

Es posible que también deba vaciar explícitamente el búfer para que se canalice durante la generación. Esto se debe a que la salida generalmente solo se imprime cuando el búfer de la tubería se llena (que creo que está en kilobytes) y cuando finaliza el mensaje estándar. Probablemente esto sea para ahorrar en lectura/escritura. Puede hacer esto después de cada impresión, o si está realizando un bucle, después de la última impresión dentro del bucle.

import sys
...
print('Some message')
sys.stdout.flush()

Respuesta2

Ejecute Python con la bandera sin búfer:

python -u myprog.py > output.txt

Luego, la salida se imprimirá en tiempo real.

Respuesta3

En lugar de intentar seguir un archivo activo, utilice teeen su lugar. Fue creado para hacer exactamente lo que intentas hacer.

Decamiseta de hombre:

tee(1) - página de manual de Linux

Nombre tee: lee desde la entrada estándar y escribe en archivos y salidas estándar

Sinopsis

tee [OPTION]... [FILE]...

Descripción

Copie la entrada estándar a cada ARCHIVO y también a la salida estándar.

-a, --append  
   append to the given FILEs, do not overwrite  
-i, --ignore-interrupts  
   ignore interrupt signals   
--help  
   display this help and exit  
--version
   output version information and exit

Si un ARCHIVO es -, cópielo nuevamente a la salida estándar.

Entonces en tu caso ejecutarías:

python myprog.py | tee output.txt

EDITAR: Como otros han señalado, esta respuesta se encontrará con el mismo problema que tenía OP originalmente a menos que sys.stdout.flush()se use en el programa Python como se describe en la respuesta aceptada de Davey. Las pruebas que hice antes de publicar esta respuesta no reflejaron con precisión el caso de uso de OP.

teetodavía se puede utilizar como método alternativo, aunque menos que óptimo, para mostrar el resultado y al mismo tiempo escribir en el archivo, pero la respuesta de Davey es claramente la mejor y correcta.

Respuesta4

Cuando uso tail, casi siempre rastrea un archivo de registro, por ejemplo, mensajes (de correo electrónico).

Esto puede ser un poco extravagante, pero en lugar de usar print// en su código Python, print()¿ write()por qué no usar el módulo de registro? (del PSL) NB: se puede configurar un formateador de registros para NO generar todos esos códigos de tiempo y de identificación asociados con un registro tradicional.

La salida se puede configurar para ir a un archivo (de datos) y, como no hay retraso en el almacenamiento en búfer ni redirección, tail funciona felizmente y con inmediatez.

Saludos

información relacionada