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.txt
comienza 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 tee
en su lugar. Fue creado para hacer exactamente lo que intentas hacer.
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.
tee
todaví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