如何在不写入驱动器的情况下将文件输入子进程?
How to input a file into a subprocess without writing to a drive?
我正在研究飞机几何形状的优化器,在优化过程中,需要 运行 在 AVL(开源,Fortran)中进行模拟,它将几何形状作为输入,输出有用的数据。目前,程序的 AVL 部分是这样工作的:
def resultados_avl(aircraft, command):
process = subprocess.Popen(['avl'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
path = create_file(aircraft, False)
if command[0] == 'alpha':
out = process.communicate(bytes('load %s\noper\na a %.3f\nx\nst\n\nquit\n' % (path, command[1]), 'utf-8'))[0]
if command[0] == 'trim':
out = process.communicate(bytes('load %s\noper\na pm %.3f\nx\nst\n\nquit\n' % (path, 0), 'utf-8'))[0]
process.terminate()
output = out.decode('utf-8')
results = dict()
# Proceeds to do some RegEx "fun" in AVL's output
此方法的问题是需要创建一个文件供AVL 读取。它是一个带有几何描述的简单文本文件,但正如您所知,读写文件速度很慢,性能在优化器中非常重要。
我的问题:有没有办法在不写入驱动器的情况下获取 AVL 的输入?
我想修改 Fortran 源代码以从 stdin 获取输入缓冲区,但我什至不知道从哪里开始。
正如 Vladimir F 指出的那样,这可以通过删除 open()
和 close()
语句并更改用于 read()
语句的单位来完成。
在 AVL 源代码中,几何输入是在 ainput.f
文件中处理的。我所做的更改是注释第72和1096行,其中open()
和close()
语句,并将第1152行中的单位更改为*
,如下:
20 READ (*,1000,END=80,ERR=90) LINE
现在,AVL 不再从指定文件读取,而是从标准输入读取。
我正在研究飞机几何形状的优化器,在优化过程中,需要 运行 在 AVL(开源,Fortran)中进行模拟,它将几何形状作为输入,输出有用的数据。目前,程序的 AVL 部分是这样工作的:
def resultados_avl(aircraft, command):
process = subprocess.Popen(['avl'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
path = create_file(aircraft, False)
if command[0] == 'alpha':
out = process.communicate(bytes('load %s\noper\na a %.3f\nx\nst\n\nquit\n' % (path, command[1]), 'utf-8'))[0]
if command[0] == 'trim':
out = process.communicate(bytes('load %s\noper\na pm %.3f\nx\nst\n\nquit\n' % (path, 0), 'utf-8'))[0]
process.terminate()
output = out.decode('utf-8')
results = dict()
# Proceeds to do some RegEx "fun" in AVL's output
此方法的问题是需要创建一个文件供AVL 读取。它是一个带有几何描述的简单文本文件,但正如您所知,读写文件速度很慢,性能在优化器中非常重要。
我的问题:有没有办法在不写入驱动器的情况下获取 AVL 的输入?
我想修改 Fortran 源代码以从 stdin 获取输入缓冲区,但我什至不知道从哪里开始。
正如 Vladimir F 指出的那样,这可以通过删除 open()
和 close()
语句并更改用于 read()
语句的单位来完成。
在 AVL 源代码中,几何输入是在 ainput.f
文件中处理的。我所做的更改是注释第72和1096行,其中open()
和close()
语句,并将第1152行中的单位更改为*
,如下:
20 READ (*,1000,END=80,ERR=90) LINE
现在,AVL 不再从指定文件读取,而是从标准输入读取。