Speichern stdout aus Teilprozess.Popen auf Datei und schreiben mehr Dinge auf die Datei
Ich Schreibe ein python-Skript, dass verwendet Teilprozess.Popen ausführen von zwei Programmen (aus der kompilierte C-code), die jeder produzieren stdout. Das script bekommt, dass die Ausgabe und speichert Sie in einer Datei. Weil die Ausgabe ist manchmal groß genug, um zu überwältigen Teilprozess.ROHR, wodurch das Skript zu hängen, ich schicke die Standardausgabe direkt in die log-Datei. Ich möchte mein Skript etwas schreiben zu Beginn und am Ende der Datei, und zwischen den beiden Teilprozess.Popen Anrufe. Allerdings, wenn ich mir meine log-Datei, alles, was ich schrieb, um die log-Datei aus dem script alle zusammen am Anfang der Datei, gefolgt von allen ausführbaren Datei stdout. Wie kann ich interleave meine hinzugefügten text in der Datei?
def run(cmd, logfile):
p = subprocess.Popen(cmd, shell=True, universal_newlines=True, stdout=logfile)
return p
def runTest(path, flags, name):
log = open(name, "w")
print >> log, "Calling executable A"
a_ret = run(path + "executable_a_name" + flags, log)
print >> log, "Calling executable B"
b_ret = run(path + "executable_b_name" + flags, log)
print >> log, "More stuff"
log.close()
Die log-Datei hat:
Aufruf von ausführbaren Ein
Aufruf von ausführbaren B
Mehr Zeug
[... stdout aus beiden executables ...]
Gibt es eine Möglichkeit kann ich Ein flush stdout, um das Protokoll nach dem Aufruf von Popen, zum Beispiel? Eine weitere Sache, die relevant sein könnten: Executable A beginnt dann pends auf B und nach B Zeug druckt und abgeschlossen ist, Ein und gibt dann mehr Material und Oberflächen.
Ich bin mit Python 2.4 auf RHE Linux.
InformationsquelleAutor der Frage jasper77 | 2010-07-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man sagen .wait() auf jeder Popen-Objekt, um sicher zu sein, dass es fertig ist und dann call log.flush(). Vielleicht so etwas wie dieses:
Wenn Sie brauchen, um die Interaktion mit dem Popen-Objekt in Ihrer äußeren Funktion, die Sie verschieben konnte .wait () - Aufruf statt.
InformationsquelleAutor der Antwort Benno
Müssen Sie warten, bis der Prozess beendet ist, bevor Sie fortfahren. Ich habe auch konvertiert den code-Kontext-manager, der ist sauberer.
InformationsquelleAutor der Antwort Chris B.
Ich Sag nur keep it real einfach. Pseudo-code, basic-Logik:
InformationsquelleAutor der Antwort Peter Lyons
Wie ich es verstehe
A
Programm wartet aufB
zu tun, seine Sache undA
Ausfahrten nur nachB
beendet.Wenn
B
starten können, ohneA
läuft, dann könnte man anfangen, die Prozesse in der umgekehrten Reihenfolge:Hinweis: der Aufruf
log.flush()
in die wichtigsten Prozesse hat keinen Einfluss auf die Datei Puffer in die Kind-Prozesse.Wenn untergeordnete Prozesse, die Verwendung von block-buffering für stdout, dann können Sie versuchen, Sie zu zwingen zu erröten früher mit pexpect, pty, oder stdbuf (es wird davon ausgegangen, dass die Prozesse verwenden Sie die line-Pufferung, wenn Sie Sie interaktiv laufen lassen, oder Sie nutzen C stdio-Bibliothek für I/O).
InformationsquelleAutor der Antwort jfs