Ist es nur meine Umgebung?
Wenn in einem Python-Skript die Standardausgabe (Fehlerausgabe) in eine Datei konvertiert oder von einem anderen Python-Skript ausgeführt wird, ist das Ausgabe-Timing falsch. Es wird sofort ausgegeben, wenn der Prozess endet, nicht wenn print oder sys.stdout.write ausgeführt wird.
Dies ist das ausgeführte Python-Skript. Geben Sie einfach jede Sekunde eine Nummer.
child1.py
from time import sleep
for i in range(10):
print(str(i))
sleep(1)
Wenn dies mit dem folgenden Befehl ausgeführt wird, wird nichts ausgegeben und nach Ablauf von 10 Sekunden wird sofort ein Protokoll ausgegeben.
$ python3 ./child1.py > stdout.log & tail -f stdout.log
Weiter ist die geänderte Version. Versuchen Sie, sys.stdout.flush nach dem Drucken auszuführen.
child2.py
from time import sleep
import sys
for i in range(10):
print(str(i))
sys.stdout.flush()
sleep(1)
Wenn Sie den folgenden Befehl ausführen, wird er ebenfalls jede Sekunde ausgegeben.
$ python3 ./child2.py > stdout.log & tail -f stdout.log
Apropos,
$ python3 ./child1.py
Die Ausgabe auf dem Bildschirm ist problemlos möglich.
Als übergeordnetes Skript habe ich das in hier veröffentlichte verwendet.
parent.py
import sys
import subprocess
def get_lines(cmd):
'''
:param cmd:str auszuführender Befehl.
:rtype: generator
:return:Standardausgabe(Zeile für Zeile).
'''
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while True:
line = proc.stdout.readline()
if line:
yield line.decode('utf-8')
if not line and proc.poll() is not None:
break
if __name__ == '__main__':
for line in get_lines(cmd='python3 ./child1.py'): # ./child2.Wenn ich py starte, wird es jede Sekunde ausgegeben
sys.stdout.write(line)
Selbst bei der Ausgabe auf dem Bildschirm wird child1.py nach 10 Sekunden sofort und child2.py alle 1 Sekunde ausgegeben.
Ist es so etwas? → So etwas.
(Zusatz) Wie im Kommentar unten ausgeführt, wurde bestätigt, dass die Option -u, die beim Ausführen des Befehls python3 hinzugefügt wird, jederzeit ausgegeben wird. Ich bin wieder schlauer geworden. \ # Ich werde versuchen, das System "Ich konnte es nicht tun" zu schreiben.