Python subprocess.Popen 和异步输出
我有一个简单的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)