2013-04-10 16 views
5

Mam skrypt Pythona, który wywołuje plik wykonywalny. Wyjście pliku wykonywalnego jest przekierowywane do pliku dziennika wraz z informacjami o czasie jego wywołania. Na przykład za pomocą python -V jako plik wykonywalny, aby zilustrować:Dlaczego podprocesować standardowe wyjście do pliku jest zapisane w kolejności?

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) 

Wyjście pliku LOGFILE.txt jest:

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

Gdzie Spodziewałem się go w następujący sposób:

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

Pisałem ****** i informacje o czasie w otwartym pliku dziennika przed uruchomieniem podprocesu i przekierowaniem jego danych wyjściowych i błędów do pliku. Dlaczego takie zamawianie? i jak mogę zmienić kolejność?

+0

Spróbuj F.flush(), przed uruchomieniem podprocesu. – gcbirzan

+0

Pracowałem! Czy możesz zamieścić to jako odpowiedź z małym wyjaśnieniem? – amyassin

Odpowiedz

6

Należy wywołać F.flush() przed uruchomieniem podprocesu. Powodem tego jest to, że podproces będzie przepłukiwał bufory po zakończeniu, podczas gdy ty nie.

+0

Więc pisałem we właściwej kolejności, ale tak naprawdę proces podprocesu pobierał swoje dane na dysk przede mną? – amyassin

+1

Technicznie nie, dane zostały wypłukane z buforów przestrzeni użytkownika, które są specyficzne dla procesu. Te jądra nie są. Gdy proces się zakończy, opróżnia bufory, więc jeśli chcesz, aby dane dotarły na dysk (ostatecznie) w tej samej kolejności, musisz je przepłukać. – gcbirzan

+3

Przenoszenie danych z procesu do systemu operacyjnego jest kosztowną operacją, więc biblioteki C buforują dane w procesie i zapisują mniej często. Po zakończeniu podprocesu jego clib przepuścił dane do systemu operacyjnego, ale proces nadrzędny wciąż lokalnie gromadził dane. Z punktu widzenia systemu operacyjnego subproces został napisany jako pierwszy. – tdelaney

Powiązane problemy