linux tee no funciona con python?

102

Hice un script de Python que se comunica con un servidor web usando un bucle infinito. Quiero registrar todos los datos de comunicación en un archivo y también monitorearlos desde el terminal al mismo tiempo. así que usé el comando tee como este.

python client.py | tee logfile

sin embargo, no obtuve nada de la terminal ni del archivo de registro. la secuencia de comandos de Python está funcionando bien. ¿que está sucediendo aquí? ¿Me estoy perdiendo de algo?

se agradecería algún consejo. gracias de antemano.

daehee
fuente
3
El almacenamiento en búfer se comporta de manera diferente para tuberías y terminales. Es posible que deba hacer un explícito sys.stdout.flush()de su secuencia de comandos cada vez que inicie sesión en una línea.
Lukas Graf
Para conocer otras formas de activar la salida sin búfer, consulte stackoverflow.com/q/107705/1328439
Dmitri Chubarov

Respuestas:

178

De man python:

   -u     Force stdin, stdout and stderr to  be  totally  unbuffered.   On  systems
          where it matters, also put stdin, stdout and stderr in binary mode.  Note
          that there is internal buffering in xreadlines(), readlines()  and  file-
          object  iterators  ("for  line  in sys.stdin") which is not influenced by
          this option.  To work around this, you will want to use  "sys.stdin.read‐
          line()" inside a "while 1:" loop.

Entonces, lo que puedes hacer es:

/usr/bin/python -u client.py >> logfile 2>&1

O usando tee:

python -u client.py | tee logfile
Vor
fuente
1
Una alternativa sería usar script, que también deshabilita el almacenamiento en búfer y además hace que C-afuncionen las secuencias de control ( , teclas de cursor, etc.): stackoverflow.com/a/39269661/15690 .
blueyed
¡excelente! también funcionó en Python 3 en mi Raspberry Pi 3 equipada con Raspbian Jessie: python3 -u client.py | tee logfile
Antonino
Una nota: Python, al igual que varios otros comandos, utilizará el búfer de línea si stdin y stdout son consolas, pero el búfer completo si los resultados se redirigen a un archivo o una tubería. teese ve como una tubería (que es) y no el híbrido: escribe en la consola. Nota: el comportamiento también podría controlarse dentro de un programa de Python.
Giacomo Catenazzi
Otra nota: python -u client.py | tee >> logfileno funcionaría. El >>introduciría otro caso de escritura en búfer en un archivo. Eso es lo que tee -aresuelve.
tanius