1

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

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

4

1 回答 1

3

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

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

f.write("line1\n")
f.flush()
subprocess.call(arg, stdout=f)
f.write("line3\n")
于 2013-05-19T14:27:42.370 回答