Redirigir la salida del programa a la pantalla y al archivo simultáneamente

Redirigir la salida del programa a la pantalla y al archivo simultáneamente

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 -oLno resolvió el problema. Pero resulta que tanto Python 2 como 3 (de cuyas subversiones, no lo sé, lo siento), admiten una -uopción que crea stdouty stderrsin 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 stdintambié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 teelo que el OP ya había deducido; solo necesita python -ubrindar un comportamiento más familiar.

información relacionada