2013-05-19 108 views
1

我對執行python命令和shell命令(來自子進程)的順序感到困惑。按順序執行python命令和shell命令(使用子進程)

例如,我有一個簡單的代碼:

import subprocess 
import shlex 

command="echo 'test'" 
arg=shlex.split(command) 

with open("out.txt", "w") as f: 
    f.write("line1\n") 
    subprocess.call(arg, stdout=f) 
    f.write("line3\n") 

我希望out.txt是:

line1 
test 
line3 

然而,實際out.txt是:

test 
line1 
line3 

有人可以解釋原因嗎? 謝謝。

回答

3

顯然,在輸出寫入底層文件描述符(通過write()系統調用)之前,Pythons文件對象執行一些緩衝操作。所以line1結束在緩衝區但尚未寫入文件。子進程繼承尚未寫入的文件描述符,寫入行test,然後Python將line3寫入其緩衝區,最後將line1line3刷新爲文件描述符。

要解決此問題,刷新文件調用子之前:

f.write("line1\n") 
f.flush() 
subprocess.call(arg, stdout=f) 
f.write("line3\n") 
+0

謝謝你,湯姆。這真的很有幫助。我將檢查file.flush()的東西。 – dbrg77