2013-04-10 6 views
5

Ich habe ein Python-Skript, das eine ausführbare Datei aufruft. Die Ausgabe der ausführbaren Datei wird zusammen mit einigen Informationen über den Zeitpunkt des Aufrufs in eine Protokolldatei umgeleitet. Zum Beispiel mit python -V als ausführbare Datei zu veranschaulichen:Warum wird die Subprozedur von stdout in eine Datei nicht in der richtigen Reihenfolge geschrieben?

import time, subprocess 
with open('./LOGFILE.txt', 'a') as F: 
    F.write('******\n') 
    F.write('Events on %s :\n'%time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) 
    EXE_output = subprocess.call(['python', '-V'], stdout=F, stderr=F) 

Die Ausgabe der Datei LOGFILE.txt ist:

Python 2.7.3 
****** 
Events on 2013-04-10 19:27:25 : 

Wo ich es erwartet wie folgt:

****** 
Events on 2013-04-10 19:27:25 : 
Python 2.7.3 

schrieb ich die ****** und Zeitinfo in der geöffneten Protokolldatei vor dem Ausführen des Unterprozesses und Weiterleiten seiner Ausgabe und Fehler in die Datei. Warum bestellt man so? und wie kann ich nachbestellen?

+0

Versuchen Sie F.flush(), bevor Sie den Subprozess ausführen. – gcbirzan

+0

Arbeitete! Kannst du es als Antwort mit einer kleinen Erklärung veröffentlichen? – amyassin

Antwort

6

Sie sollten F.flush() aufrufen, bevor Sie den Subprozess ausführen. Der Grund dafür ist, dass der Subprozess die Puffer löscht, wenn er fertig ist, während Sie es nicht sind.

+0

Also schrieb ich in der richtigen Reihenfolge, aber tatsächlich erhielt der Subprozess-Prozess seine Daten auf die Festplatte vor mir? – amyassin

+1

Technisch nicht, die Daten wurden aus den User-Space-Puffern gelöscht, die prozessspezifisch sind. Die Kernel sind nicht. Wenn der Prozess abgeschlossen ist, werden die Puffer gelöscht. Wenn Sie also sichergehen möchten, dass die Daten in der gleichen Reihenfolge auf dem Datenträger ankommen, müssen Sie spülen. – gcbirzan

+3

Das Verschieben von Daten von einem Prozess zum Betriebssystem ist eine kostspielige Operation, daher puffern die C-Bibliotheken Daten im Prozess und schreiben weniger häufig. Wenn Ihr Subprozess beendet wurde, löschte sein Clib die Daten an das Betriebssystem, aber der übergeordnete Prozess hielt seine Daten weiterhin lokal. Aus Sicht des Betriebssystems schrieb der Subprozess zuerst. – tdelaney

Verwandte Themen