Führen Sie ein Programm aus und melden Sie sich in Echtzeit am Bildschirm und an der Datei an

662
Greedo

Ich habe ein sehr einfaches Python-Programm geschrieben (in Wirklichkeit ist mein Programm viel komplexer):

from time import sleep for i in range(10): print(i) sleep(1) 

um die Ziffern 0-9, 1 jede Sekunde über 10 Sekunden zu drucken. Ich habe es als gespeichertTestShell.py

Ich kann es in Powershell laufen lassen

python .\TestShell.py 

die korrekt ausgibt, 1 Sekunde pro Sekunde. Ich möchte jedoch auch die Ausgabe in einer Protokolldatei speichern. Ich hatte erwartet, das Tee-Objectfür dieses zu verwenden

python .\TestShell.py | Tee-Object -FilePath .\fileLog.txt 

Dabei wird die Protokolldatei als ein Parameter verwendet und ohne einen 2. Parameter implizit in die Konsole geschrieben. Es wird jedoch jetzt keine Ausgabe gedruckt, bis das gesamte Programm ausgeführt wird. Das heißt, ich sehe für 10 Sekunden nichts, dann die Zahlen 0-9 auf einmal.

Gibt es eine Möglichkeit, eine (Python-) Datei auszuführen, die in Echtzeit an das Terminal und eine Protokolldatei ausgegeben wird?

2
Ehrlich gesagt würde ich die Protokollierung im Skript selbst hinzufügen. LPChip vor 5 Jahren 0
@LPChip Ich habe darüber nachgedacht, aber in der Realität kommt der größte Teil der Programmausgabe aus einer Bibliothek, auf die ich mich beziehe - ich möchte nicht hineinschauen, um die Protokollierung zu ändern. Selbst wenn ich den Standard-Logger mit einem benutzerdefinierten überlade, kann ich nicht garantieren, dass die Bibliothek dies auch tut. Ich brauche also einen generischen Ansatz, der stdout überwacht und in eine Datei kopiert. Ich dachte, das wäre genau das, was "tee" tun würde - vielleicht ein paar andere Parameter? Greedo vor 5 Jahren 1

2 Antworten auf die Frage

1
Greedo

Nun, ein Ansatz kann hier gefunden werden

Verwenden Sie die Option -u, um den Puffermodus von Python selbst zu ändern

python -u .\TestShell.py | Tee-Object -FilePath .\fileLog.txt 

Dies ist jedoch keine Lösung für alle Sprachen

1
harrymc

Das Problem ist, dass die PowerShell Tee-Objectden Ausgabestrom nicht leert, sondern nur darauf wartet, dass die Quelle dies tut, sodass Sie die Ausgabe am Ende der Operation erhalten. Dies ist beabsichtigt.

Verwenden Sie stattdessen diese Syntax, um die Ausgabe Zeile für Zeile zu schreiben:

python .\TestShell.py | ForEach-Object { Write-Host $_; $_} | Set-Content .\fileLog.txt 
Scheint nicht zu funktionieren - sowohl das Protokoll als auch das Terminal werden nur am Ende der Ausführung geschrieben: / PS Ich gehe davon aus, dass das abschließende `` `ein Tippfehler ist Greedo vor 5 Jahren 0
Ist dies eine Antwort, die im Zusammenhang mit der [Selbstantwort des ursprünglichen Posters] steht (https://superuser.com/a/1376244/167207)? JakeGould vor 5 Jahren 0
Sollte funktionieren. Seltsam. harrymc vor 5 Jahren 0