我是刚进入蟒蛇世界的人。最近,我被要求在XFoil (一个空气动力学程序)和python之间建立一个接口。经过一些研究,我发现了子处理模块。正如文档所述,它用于“生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码”。
问题是,我需要一些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用于获取这个输出档案,但它们是不可访问的。
有人知道为什么会发生这种事吗?
发布于 2021-12-21 09:45:34
为什么您认为process.stdin.tell()应该“获取这个输出档案”?它检索文件指针的位置。
我想象这里的实际问题是子进程没有立即写入文件。在尝试打开它们之前,可能只是time.sleep(1),或者想出一种方法来告诉您何时完成了写入(某些OSes允许您告诉另一个进程是否打开了用于写入的文件,但我不知道这在Windows上是否可行,更不用说可靠了)。
显然,在任意时间内睡眠并不是很健壮;您无法预测子进程写入文件所需的时间。但是,如果这解决了你眼前的问题,至少你知道是什么原因造成的,也许接下来该去哪里找。
顺便说一句,也许可以查看input=关键字参数,用于subprocess.run()。如果子进程并行运行并不重要,那么这可能更令人愉快,也更健壮。
(从注释线程转换为答复。)
https://stackoverflow.com/questions/70432535
复制相似问题