2013-04-10 12 views
5

Ho uno script python che chiama un eseguibile. L'output dell'eseguibile viene reindirizzato a un file di registro insieme ad alcune informazioni sull'ora in cui è stato chiamato. Ad esempio, utilizzando python -V come l'eseguibile per illustrare:Perché lo sottoprocesso stdout in un file è stato scritto fuori servizio?

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) 

L'output del file LOGFILE.txt è:

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

Dove mi aspettavo come segue:

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

ho scritto il ****** e le informazioni sull'ora nel file di registro aperto prima di eseguire il sottoprocesso e reindirizzarne l'output e l'errore nel file. Perché ordinare in questo modo? e come posso riordinare?

+0

Provare F.flush(), prima di eseguire il sottoprocesso. – gcbirzan

+0

Ha funzionato! Puoi postarlo come risposta con una piccola spiegazione? – amyassin

risposta

6

È necessario chiamare F.flush() prima di eseguire il sottoprocesso. La ragione di ciò è che il sottoprocesso svuota i buffer quando termina, mentre non lo sei.

+0

Quindi stavo scrivendo nell'ordine giusto, ma in realtà il processo di sottoprocesso stava ricevendo i suoi dati sul disco prima di me? – amyassin

+1

Tecnicamente no, i dati sono stati svuotati dai buffer degli spazi utente, che sono specifici del processo. I kernel non lo sono. Al termine del processo, svuota i suoi buffer, quindi se vuoi che i dati arrivino sicuri sul disco (eventualmente) nello stesso ordine, devi eseguire il flush. – gcbirzan

+3

Lo spostamento di dati da un processo al sistema operativo è un'operazione costosa, pertanto le librerie C memorizzano i dati nel processo e scrivono meno frequentemente. Quando il sottoprocesso terminava, la sua clib scaricava i dati nel sistema operativo, ma il processo genitore continuava a mantenere i propri dati localmente. Dal punto di vista del sistema operativo, il sottoprocesso ha scritto per primo. – tdelaney

Problemi correlati