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

Getting output archives while using subprocess module

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

问题是我需要一些 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\n{airfoil_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用于获取此输出存档,但无法访问。

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

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

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

任意时间休眠显然不是很稳健;您无法预测子进程写出文件需要多长时间。但是,如果这解决了您眼前的问题,至少您对导致它的原因以及下一步可能要看的地方有所了解。

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

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