Python subprocess.Popen 和异步输出

8 投票
1 回答
9286 浏览
提问于 2025-04-17 03:15

我有一个简单的Python脚本,可以在Windows和Linux上执行测试套件。每个测试都会把它的输出写到一个单独的文件里。我使用subprocess.Popen这个类来循环执行命令。

每个命令都是这样开始的:

def system_execute(self, command, path, out_file):
    params_list = command.split(' ') 
    file_path = os.path.join(path, out_file)
    f = open(file_path, "w")
    subprocess.Popen(params_list, stdout=f)
    f.close()

这个脚本运行得很好,但它在所有输出文件写完之前就结束了。实际上,我得到了几百个大小为零的文件,因为写输出和关闭文件句柄需要一些时间。有人能解释一下为什么会这样吗?有没有什么同步的方法可以完成同样的工作?

谢谢

1 个回答

16

在调用 f.close() 之前,你需要先用 wait() 等待我们的子进程完成。

def system_execute(self, command, path, out_file):
    params_list = command.split(' ') 
    file_path = os.path.join(path, out_file)
    f = open(file_path, "w")
    sp = subprocess.Popen(params_list, stdout=f)
    sp.wait()
    f.close()

或者直接这样做

def system_execute(self, command, path, out_file):
    params_list = command.split(' ') 
    file_path = os.path.join(path, out_file)
    f = open(file_path, "w")
    subprocess.call(params_list, stdout=f)
    f.close()

(或者,为了更方便地处理文件,

[...]
    with open(file_path, "w") as f:
        subprocess.call(params_list, stdout=f)

撰写回答