使用子流程模块时获取输出档案

Posted

技术标签:

【中文标题】使用子流程模块时获取输出档案【英文标题】:Getting output archives while using subprocess module 【发布时间】:2022-01-22 16:52:16 【问题描述】:

我是这个 python 世界的新手。最近我被要求在 XFoil(一个空气动力学程序)和 python 之间建立一个接口。经过一番研究,我找到了 subprocess 模块。正如文档所说,它用于“生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。”

问题是我需要一些 XFoil 在运行时创建的输出存档。如果我关闭程序,档案是可访问的,但如果我在子进程仍处于打开状态时尝试打开或读取它们,则会出现以下错误(尽管我可以在文件夹中看到档案):

OSError:找不到保存

代码如下:

import subprocess
import numpy as np 
import os

process = subprocess.Popen(['<xfoil_path>'], stdin=subprocess.PIPE, universal_newlines=True, creationflags = subprocess.CREATE_NEW_PROCESS_GROUP)
airfoil_path = '<path to airfoil>'
process.stdin.write(f'\nload\nairfoil_path')
process.stdin.write('\n\n\noper\nalfa\n2\ncpwr\nsave\n')
process.stdin.tell()
print(os.listdir())
c = np.loadtxt('save', skiprows=1)
print(c)
process.stdin.write('\n\n\noper\nalfa\n3\ncpwr\nsave2\n')

stdin.tell 用于获取此输出存档,但它们不可访问。

有人知道为什么会这样吗?

【问题讨论】:

【参考方案1】:

您为什么认为process.stdin.tell() 应该“获取此输出档案”?它检索文件指针的位置。

我想象这里的实际问题是子进程不会立即写入文件。也许只是time.sleep(1) 在您尝试打开它们之前,或者想办法让它在它完成写入时告诉您(某些操作系统让您判断另一个进程是否有一个文件打开以供写入,但我不知道这是否是在 Windows 上可能,更不用说可靠了)。

任意时间的睡眠显然不是很健壮;您无法预测子进程写出文件需要多长时间。但是,如果这能解决您眼前的问题,那么至少您对导致它的原因有所了解,并且可能知道下一步该去哪里。

顺便说一句,也许可以查看subprocess.run()input= 关键字参数。如果让子进程并行运行并不重要,那可能会更愉快也更健壮。

(从评论线程转换为答案。)

【讨论】:

以上是关于使用子流程模块时获取输出档案的主要内容,如果未能解决你的问题,请参考以下文章

无法使用子进程从标准输出获取结果

如何在python脚本中获取exe的输出?

从提升的子进程获取错误和标准输出

如何在 Perl 中获取调用堆栈列表?

将模块的输出连接到另一个并循环此逻辑以获得值列表

使用子进程获取实时输出