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 -oL
hat 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 -u
Option unterstützen, die stdout
und stderr
ungepuffert macht. Siehehttps://www.commandlinux.com/man-page/man1/python2.7.1.html.
Mir ist gerade aufgefallen (laut dieser Manpage), dass in Python 2.7 stdin
auch 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 tee
dem, was der OP bereits gefolgert hat – es muss lediglich ein python -u
vertrauteres Verhalten bereitgestellt werden.