linux tee ne fonctionne pas avec python?

102

J'ai créé un script python qui communique avec un serveur Web en utilisant une boucle infinie. Je souhaite enregistrer toutes les données de communication dans un fichier et les surveiller à partir du terminal en même temps. j'ai donc utilisé la commande tee comme celle-ci.

python client.py | tee logfile

cependant, je n'ai rien obtenu du terminal ni du fichier journal. le script python fonctionne correctement. Que se passe-t-il ici? est-ce que je manque quelque chose?

quelques conseils seraient appréciés. Merci d'avance.

daehee
la source
3
La mise en mémoire tampon se comporte différemment pour les tuyaux et les terminaux. Vous devrez peut-être faire un explicite à sys.stdout.flush()partir de votre script chaque fois que vous avez connecté une ligne.
Lukas Graf
Pour d'autres moyens de déclencher une sortie sans tampon,
Dmitri Chubarov

Réponses:

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.

Donc, ce que vous pouvez faire est:

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

Ou en utilisant tee:

python -u client.py | tee logfile
Vor
la source
1
Une alternative serait d'utiliser script, qui désactive également la mise en mémoire tampon et fait en plus fonctionner les séquences de contrôle ( C-a, les touches de curseur, etc.): stackoverflow.com/a/39269661/15690 .
blueyed le
excellent! cela fonctionnait aussi en Python 3 sur mon Raspberry Pi 3 équipé de Raspbian Jessie: python3 -u client.py | tee logfile
Antonino
Une note: python, comme diverses autres commandes, utilisera une ligne tamponnée si stdin et stdout sont des consoles, mais complètement tamponnée si les résultats sont redirigés vers un fichier ou un tube. teeest vu comme un tuyau (ce qu'il est) et non comme l'hybride: il écrit dans la console. Remarque: le comportement peut également être contrôlé dans un programme python.
Giacomo Catenazzi
Une autre note: python -u client.py | tee >> logfilene fonctionnerait pas. Le >>introduirait un autre cas d'écriture en mémoire tampon dans un fichier. C'est ce qui tee -arésout.
tanius