依次执行python命令和shell命令(使用子进程)

时间:2013-05-19 14:20:51

标签: python subprocess

我对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

有人可以解释一下原因吗? 谢谢。

1 个答案:

答案 0 :(得分:3)

显然,Pythons文件对象在输出写入底层文件描述符之前执行一些缓冲(通过write()系统调用)。所以line1最终在缓冲区中但尚未写入文件。子进程继承尚未写入的文件描述符,写入行test,然后Python将line3写入其缓冲区,最后刷新line1line3到文件描述符。

要解决此问题,请在调用子进程之前刷新文件:

f.write("line1\n")
f.flush()
subprocess.call(arg, stdout=f)
f.write("line3\n")
相关问题