o linux tee não está funcionando com python?

102

Fiz um script python que se comunica com um servidor web usando um loop infinito. Quero registrar todos os dados de comunicação em um arquivo e também monitorá-los do terminal ao mesmo tempo. então eu usei o comando tee assim.

python client.py | tee logfile

no entanto, não recebi nada do terminal nem do arquivo de log. o script python está funcionando bem. o que esta acontecendo aqui? estou esquecendo de algo?

alguns conselhos seriam apreciados. Agradeço antecipadamente.

daehee
fonte
3
O armazenamento em buffer se comporta de maneira diferente para tubos e terminais. Você pode precisar fazer uma explicação explícita sys.stdout.flush()de seu script sempre que logar uma linha.
Lukas Graf
Para outras maneiras de acionar a saída sem buffer, consulte stackoverflow.com/q/107705/1328439
Dmitri Chubarov

Respostas:

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.

Então, o que você pode fazer é:

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

Ou usando tee:

python -u client.py | tee logfile
Vor
fonte
1
Uma alternativa seria usar o script, que também desativa o armazenamento em buffer e, adicionalmente, faz com que as sequências de controle ( C-ateclas do cursor, etc.) funcionem: stackoverflow.com/a/39269661/15690 .
azulado em
excelente! funcionou também em Python 3 no meu Raspberry Pi 3 equipado com Raspbian Jessie: python3 -u client.py | tee logfile
Antonino
Uma nota: o python, como vários outros comandos, usará buffer de linha se stdin e stdout forem consoles, mas full buffered se os resultados forem redirecionados para um arquivo ou pipe. teeé visto como um tubo (o que é) e não como um híbrido: ele escreve para o console. Nota: o comportamento também pode ser controlado dentro de um programa python.
Giacomo Catenazzi
Outra nota: python -u client.py | tee >> logfilenão funcionaria. O >>introduziria um outro caso da escrita tamponada para um arquivo. Isso é o que tee -aresolve.
tanius