Linux Tee funktioniert nicht mit Python?

102

Ich habe ein Python-Skript erstellt, das über eine Endlosschleife mit einem Webserver kommuniziert. Ich möchte alle Kommunikationsdaten in einer Datei protokollieren und gleichzeitig vom Terminal aus überwachen. Also habe ich den Tee-Befehl so benutzt.

python client.py | tee logfile

Ich habe jedoch nichts vom Terminal oder der Protokolldatei erhalten. Das Python-Skript funktioniert einwandfrei. was passiert hier? vermisse ich etwas

Einige Ratschläge wären willkommen. Vielen Dank im Voraus.

daehee
quelle
3
Die Pufferung verhält sich für Rohre und Klemmen unterschiedlich. Möglicherweise müssen sys.stdout.flush()Sie bei jeder Protokollierung einer Zeile ein explizites Skript ausführen.
Lukas Graf
Weitere Möglichkeiten zum Auslösen einer ungepufferten Ausgabe finden Sie unter stackoverflow.com/q/107705/1328439
Dmitri

Antworten:

178

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

Was Sie also tun können, ist:

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

Oder mit tee:

python -u client.py | tee logfile
Vor
quelle
1
Eine Alternative wäre die Verwendung script, die auch die Pufferung deaktiviert und zusätzlich Steuersequenzen ( C-a, Cursortasten usw.) zum Funktionieren bringt : stackoverflow.com/a/39269661/15690 .
Blueyed
Ausgezeichnet! es funktionierte auch in Python 3 auf meinem Raspberry Pi 3, der mit Raspbian Jessie ausgestattet war: python3 -u client.py | Tee Logfile
Antonino
Ein Hinweis: Python verwendet wie verschiedene andere Befehle zeilengepuffert, wenn stdin und stdout Konsolen sind, aber vollständig gepuffert, wenn die Ergebnisse in eine Datei oder eine Pipe umgeleitet werden. teewird wie eine Pipe gesehen (was es ist) und nicht wie der Hybrid: Es schreibt in die Konsole. Hinweis: Das Verhalten kann auch in einem Python-Programm gesteuert werden.
Giacomo Catenazzi
Noch ein Hinweis: python -u client.py | tee >> logfilewürde nicht funktionieren. Dies >>würde einen weiteren Fall von gepuffertem Schreiben in eine Datei einführen. Das tee -alöst.
Tanius