Programmausgabe gleichzeitig auf Bildschirm und Datei umleiten

Programmausgabe gleichzeitig auf Bildschirm und Datei umleiten

Ich habe ein Python-Skript. Ich möchte das Ergebnis speichern, während es etwas im Terminal ausgibt. Ich habe versucht

python program.py 2>&1 | tee output.txt

Es scheint jedoch, dass das Programm erst nach Abschluss alle Inhalte auf dem Bildschirm ausgibt. Während es läuft, erfolgt keine Ausgabe. Das ärgert mich wirklich, da ich den Fortschritt während der Programmausführung wissen möchte. Gibt es Möglichkeiten, gleichzeitig auf dem Bildschirm und in einer Datei auszugeben?


Update 13. November 2019

Danke für die Hilfe, @egmont. Jeder, der das gleiche Problem hat, kann die folgenden Befehle ausprobieren. Die Ausgabe erfolgt auf dem Bildschirm und das Schreiben in die Datei erfolgt gleichzeitig.

stdbuf -oL python program.py 2>&1 | tee ouput.txt

Antwort1

Ich hatte das gleiche Problem („alles“, was Manipulationen beinhaltete stdout– wie nohup, Hintergrund ( &) oder Umleitung). Interessanterweise stdbuf -oLhat es das Problem für mich nicht gelöst. Aber es stellt sich heraus, dass sowohl Python 2 als auch 3 (von welchen Subversionen, weiß ich nicht, tut mir leid) eine -uOption unterstützen, die stdoutund stderrungepuffert macht. Siehehttps://www.commandlinux.com/man-page/man1/python2.7.1.html.

Mir ist gerade aufgefallen (laut dieser Manpage), dass in Python 2.7 stdinauch ungepuffert wird, während die Manpage für Python 3 (bei mir 3.10) ausdrücklich sagt"This option has no effect on the stdin stream."

Der ursprüngliche Befehl des OP würde also lauten:

python -u program.py 2>&1 | tee output.txt

Ich erhalte dann das Verhalten, das ich bei PHP/awk/usw. erwarten würde.

Da der OP gefragt hat: „Gibt es Möglichkeiten, die Ausgabe gleichzeitig auf dem Bildschirm und in einer Datei durchzuführen?“, basiert diese „Lösung“ auf teedem, was der OP bereits gefolgert hat – es muss lediglich ein python -uvertrauteres Verhalten bereitgestellt werden.

verwandte Informationen