Ich schreibe ein Python-Skript, das subprocess.Popen verwendet, um zwei Programme (aus kompiliertem C-Code) auszuführen, die jeweils stdout erzeugen. Das Skript ruft diese Ausgabe ab und speichert sie in einer Datei. Da die Ausgabe manchmal groß genug ist, um subprocess.PIPE zu überlasten, wodurch das Skript hängen bleibt, sende ich das stdout direkt an die Protokolldatei. Ich möchte, dass mein Skript etwas am Anfang und Ende der Datei und zwischen den beiden subprocess.Popen-Aufrufen schreibt. Wenn ich jedoch meine Protokolldatei anschaue, ist alles, was ich aus dem Skript in die Protokolldatei geschrieben habe, am Anfang der Datei, gefolgt von der ausführbaren Datei stdout. Wie kann ich meinen hinzugefügten Text in die Datei einfügen?Speichern von stdout aus subprocess.Popen in Datei, plus mehr Sachen in die Datei schreiben
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 Protokolldatei hat: ausführbaren Aufruf A Aufruf ausführbare B Mehr Sachen [... stdout von beiden ausführbaren Dateien ...]
Gibt es eine Möglichkeit, ich stdout die A spülen kann das Protokoll nach dem Aufrufen von Popen, zum Beispiel? Eine weitere Sache, die relevant sein könnte: Executable A beginnt dann hängt an B, und nachdem B Sachen und endet, druckt A dann mehr Zeug und endet.
Ich benutze Python 2.4 auf RHE Linux.
Wenn ich stdout = subprocess.PIPE verwendete und die äußere Schleife alles in die Protokolldatei schreiben ließ, konnte ich meinen eigenen Text mit dem Output der ausführbaren Dateien verschachteln. Wenn ich keinen Text hinzufüge, hat das Protokoll Inhalt in dieser Reihenfolge: 1) A-Ausgang 2) B-Ausgang 3) Rest von A-Ausgang. Ich könnte Text vor oder nach jedem dieser Schritte hinzufügen. Jetzt kann ich nur am Anfang oder am Ende des Protokolls Text hinzufügen. Das Hinzufügen einer wait() nach dem Popen hängt das Skript, weil B nicht starten würde, bis A beendet ist, was nicht der Fall ist, weil A auf Handshake von B wartet. Ist es möglich, meinen eigenen Text im Protokoll mit diesem Ansatz zu verschachteln? – jasper77