Tengo un script en Python. Quiero guardar su resultado mientras genera algo en la terminal. Lo intenté
python program.py 2>&1 | tee output.txt
Sin embargo, parece que sólo después de que finalice el programa, imprimirá todo el contenido en la pantalla. Mientras se está ejecutando, no hay salida. Realmente me molesta porque quiero saber el progreso mientras ejecuto el programa. ¿Hay alguna forma de generar salida a la pantalla y al archivo simultáneamente?
Actualización 13 de noviembre de 2019
Gracias por la ayuda @egmont. Cualquiera que tenga el mismo problema puede probar los siguientes comandos. Aparecerá en la pantalla y escribirá en el archivo simultáneamente.
stdbuf -oL python program.py 2>&1 | tee ouput.txt
Respuesta1
Estaba experimentando el mismo problema ("cualquier cosa" que implique manipulación stdout
, como nohup
, fondo ( &
) o redirección). Curiosamente para mí, stdbuf -oL
no resolvió el problema. Pero resulta que tanto Python 2 como 3 (de cuyas subversiones, no lo sé, lo siento), admiten una -u
opción que crea stdout
y stderr
sin búfer. Verhttps://www.commandlinux.com/man-page/man1/python2.7.1.html.
Acabo de notar (según esa página de manual) que en Python 2.7 stdin
también está sin búfer, mientras que la página de manual de Python 3 (3.10 para mí) dice específicamente"This option has no effect on the stdin stream."
Entonces, el comando original del OP sería:
python -u program.py 2>&1 | tee output.txt
Luego obtengo el comportamiento que esperaría con PHP/awk/etc.
Como el OP preguntó "¿Hay alguna forma de generar salida a la pantalla y al archivo simultáneamente?", esta "solución" se basa en tee
lo que el OP ya había deducido; solo necesita python -u
brindar un comportamiento más familiar.