【问题标题】:How to input a file into a subprocess without writing to a drive?如何在不写入驱动器的情况下将文件输入子进程?
【发布时间】:2021-12-17 05:01:06
【问题描述】:

我正在研究飞机几何形状的优化器,在优化过程中,需要在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 源代码以从标准输入获取输入缓冲区,但我什至不知道从哪里开始。

【问题讨论】:

  • 嗯,理论上应该是可以的,只是让它从不同的单元读取。但是如果没有源代码,很难告诉你任何细节。在 Fortran 中,您可以删除 open() 语句和 close() 语句,并将用于 read 语句的单位更改为从标准输入中读取。但是您应该自己尝试一下,并在尝试时遇到一些特定的问题。
  • 这正是我最终所做的!我稍后会自己回答这个问题,以帮助将来有人遇到同样的问题。

标签: python file io fortran


【解决方案1】:

正如Vladimir F 所指出的,这可以通过删除open()close() 语句并更改用于read() 语句的单位来完成。

在 AVL 源代码中,几何输入在 ainput.f 文件中处理。我所做的更改是注释第 72 行和第 1096 行,其中有 open()close() 语句,并将第 1152 行中的单位更改为 *,如下所示:

20 READ (*,1000,END=80,ERR=90) LINE

现在,AVL 不再从指定文件读取,而是从标准输入读取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多