También es posible que 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 es en kilobytes, creo) y cuando finaliza el mensaje de entrada estándar. Esto es probablemente para ahorrar en lecturas/escrituras. Puede hacer esto después de cada impresión, o si está haciendo un bucle, después de la última impresión dentro del bucle.
import sys
...
print('Some message')
sys.stdout.flush()
Ejecute python con la marca sin búfer:
python -u myprog.py > output.txt
La salida se imprimirá en tiempo real.
En lugar de intentar rastrear un archivo en vivo, use tee
en cambio. Fue hecho para hacer exactamente lo que estás tratando de hacer.
De camiseta de hombre:
tee(1) - página del manual de Linux
Nombre tee - leer desde la entrada estándar y escribir en la salida estándar y archivos
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 -, copie nuevamente a la salida estándar.
Entonces, en su caso, ejecutaría:
python myprog.py | tee output.txt
EDITAR:como han señalado otros, esta respuesta se encontrará con el mismo problema que OP tenía originalmente a menos que sys.stdout.flush()
se usa 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 usar como un método alternativo, aunque menos que óptimo, para mostrar la salida mientras se escribe en el archivo, pero la respuesta de Davey es claramente la mejor y correcta.