2013-04-10 86 views
5

我有一個調用可執行文件的python腳本。可執行文件的輸出會被重定向到一個日誌文件以及一些關於它被調用的時間的信息。例如,使用python -V作爲可執行來說明:爲什麼子進程標準輸出到文件是亂序寫入的?

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) 

文件LOGFILE.txt的輸出是:

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

凡我所期待的,如下所示:

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

我寫的在運行子進程並將其輸出和錯誤重定向到文件之前,打開的日誌文件中包含******和時間信息。爲什麼要這樣訂購?以及如何重新訂購?

+0

嘗試F.flush(),然後運行子進程。 – gcbirzan 2013-04-10 16:37:48

+0

工作!你可以把它作爲一個答案和一個小解釋嗎? – amyassin 2013-04-10 16:39:17

回答

6

您應該在運行子進程之前調用F.flush()。這是因爲子進程在完成時刷新緩衝區,而不是。

+0

所以我寫的是正確的順序,但實際上子進程是在我之前把它的數據存到磁盤上的? – amyassin 2013-04-10 17:05:24

+1

從技術上說,不是,數據從用戶空間緩衝區中清除,這些緩衝區是特定於進程的。內核的不是。當進程結束時,刷新它的緩衝區,所以如果你希望數據按照相同的順序到達磁盤(最終),你需要刷新。 – gcbirzan 2013-04-10 17:17:24

+3

將數據從進程移動到操作系統是一項昂貴的操作,因此C庫會緩存進程中的數據並降低寫入頻率。當你的子進程退出時,它的clib將數據刷新到操作系統,但你的父進程仍然在本地保存它的數據。從操作系統的角度來看,子進程首先寫入。 – tdelaney 2013-04-10 17:26:51

相關問題