我对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
有人可以解释一下原因吗? 谢谢。
答案 0 :(得分:3)
显然,Pythons文件对象在输出写入底层文件描述符之前执行一些缓冲(通过write()
系统调用)。所以line1
最终在缓冲区中但尚未写入文件。子进程继承尚未写入的文件描述符,写入行test
,然后Python将line3
写入其缓冲区,最后刷新line1
和line3
到文件描述符。
要解决此问题,请在调用子进程之前刷新文件:
f.write("line1\n")
f.flush()
subprocess.call(arg, stdout=f)
f.write("line3\n")