Live-Ausgabe des Unterprozessbefehls

Ich verwende ein Python-Skript als Treiber für einen Hydrodynamik-Code. Wenn es darum geht, die Simulation auszuführen, verwende ichsubprocess.Popen Um den Code auszuführen, sammeln Sie die Ausgabe von stdout und stderr in asubprocess.PIPE --- Dann kann ich die Ausgabeinformationen drucken (und in einer Protokolldatei speichern) und nach Fehlern suchen. Das Problem ist, ich habe keine Ahnung, wie der Code fortschreitet. Wenn ich es direkt von der Kommandozeile aus starte, erhalte ich eine Ausgabe darüber, um welche Iteration es sich handelt, zu welcher Zeit, in welchem ​​Zeitschritt usw.

Gibt es eine Möglichkeit, sowohl die Ausgabe zu speichern (für die Protokollierung und Fehlerprüfung) als auch eine Live-Streaming-Ausgabe zu erstellen?

Der relevante Abschnitt meines Codes:

ret_val = subprocess.Popen( run_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True )
output, errors = ret_val.communicate()
log_file.write(output)
print output
if( ret_val.returncode ):
    print "RUN failed\n\n%s\n\n" % (errors)
    success = False

if( errors ): log_file.write("\n\n%s\n\n" % errors)

Ursprünglich leitete ich dierun_command durchtee so dass eine kopie direkt in die log-datei ging und der stream immer noch direkt auf das terminal ausgegeben wird - aber auf diese weise kann ich keine fehler speichern (soweit ich weiß).

Bearbeiten:

Vorübergehende Lösung:

ret_val = subprocess.Popen( run_command, stdout=log_file, stderr=subprocess.PIPE, shell=True )
while not ret_val.poll():
    log_file.flush()

Führen Sie dann in einem anderen Terminal austail -f log.txt (s.t.log_file = 'log.txt').

Antworten auf die Frage(13)

Ihre Antwort auf die Frage