linux tee non funziona con python?


103

Ho creato uno script Python che comunica con un server web utilizzando un ciclo infinito. Voglio registrare tutti i dati di comunicazione in un file e monitorarli contemporaneamente dal terminale. quindi ho usato il comando tee in questo modo.

python client.py | tee logfile

tuttavia, non ho ricevuto nulla dal terminale né dal file di registro. lo script python funziona bene. cosa sta succedendo qui? mi sto perdendo qualcosa?

qualche consiglio sarebbe apprezzato. Grazie in anticipo.


3
Il buffering si comporta in modo diverso per tubi e terminali. Potrebbe essere necessario eseguire un esplicito sys.stdout.flush()dal tuo script ogni volta che hai registrato una riga.
Lukas Graf

Per altri modi per attivare l'output senza buffer, vedere stackoverflow.com/q/107705/1328439
Dmitri Chubarov

Risposte:


179

Da 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.

Quindi quello che puoi fare è:

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

Oppure utilizzando tee:

python -u client.py | tee logfile

1
Un'alternativa sarebbe usare script, che disabilita anche il buffering e inoltre fa funzionare le sequenze di controllo ( C-a, tasti cursore, ecc.): Stackoverflow.com/a/39269661/15690 .
blueyed il

eccellente! ha funzionato anche in Python 3 sul mio Raspberry Pi 3 equipaggiato con Raspbian Jessie: python3 -u client.py | tee logfile
Antonino

Una nota: python, come vari altri comandi, utilizzerà il buffer di riga se stdin e stdout sono console, ma il buffer completo se i risultati vengono reindirizzati a un file o una pipe. teeè visto come un pipe (qual è) e non l'ibrido: scrive su console. Nota: il comportamento potrebbe essere controllato anche all'interno di un programma python.
Giacomo Catenazzi

Un'altra nota: python -u client.py | tee >> logfilenon funzionerebbe. Il >>introdurrebbe un altro caso di scrittura tamponata in un file. Questo è ciò che tee -arisolve.
tanius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.