Wie kann man stderr des python3-Skripts mithilfe von T-Pipe umleiten?

913
jlandercy

Ich bin ein Benutzer von Debian und RedHat. Ich möchte stderr (Modul logging) aus einem Python3Skript umleiten . Das Skript gibt viele Dinge aus, und der Teil, den ich erfassen möchte, kann mit folgendem Befehl abgerufen werden:

python3 ./script.py --input ./*.txt --verbose 2>> ./script.log 

Dies hängt stderr an ./script.log. Aber ich würde diesen Dialog auch im Terminal behalten. Normalerweise erreiche ich dies, indem ich den Befehl pfeifetee . Das Problem ist, die folgende shellZeile (wird aus einer bashDatei ausgeführt):

pyhton3 ./script.py --input ./*.txt --verbose | tee -a ./script.log 

Gibt die Ausgabe in das Terminal aus, gibt aber nichts aus ./script.log. Irgendeine Idee, wie es weitergehen soll?

1

2 Antworten auf die Frage

2
John1024

Zur Anzeige sowohl stdout und stderr auf dem Terminal während nur Stderr Erfassung Datei, zu verwenden:

python3 ./script.py --input ./*.txt --verbose 2>&1 1>/dev/tty | tee -a script.log 

Die Art und Weise, wie die Shell Weiterleitungen verarbeitet, ist ziemlich subtil. Hier werden die 2>&1Ergebnisse in der Befehlszeile des Befehls an den teeBefehl weitergeleitet. 1>/dev/ttyführt dazu, dass der Befehl stdout direkt an das Terminal geht. Ordnung ist wichtig. Wenn die Reihenfolge dieser Weiterleitungen umgekehrt wird, würde nichts zur Pipe gehen. Wenn Alternativ 1>/dev/ttywurden weggelassen, dann beide stdout und stderr würde dem geleitet werden teeBefehl.

1
user2986553

Sie können Ihren stderr auf stdout umleiten und ihn dann auch so ableiten

pyhton3 ./script.py --input ./*.txt --verbose 2>&1 | tee -a ./script.log