2013-05-19 111 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