0

我正在尝试使用 Python 运行 AVL(Athena Vortex Lattice)。它是一个在单独的终端窗口上运行的软件,与 XFOIL 完全一样。用户编写命令并按下enter执行。

我正在使用该subprocess模块运行软件,终端窗口按预期打开。但是,我无法让我的 Python 程序将命令写入打开的窗口。我没有收到任何错误,但没有向 AVL 写入任何内容,并且它保持初始状态。

我尝试写入 AVL 的命令LOAD后跟输入文件的绝对路径。

这是我第一次使用 subprocess 模块,所以我可能只是忘记了某个地方的基本选项。我在 macOS 上使用 Python 3.9 运行该程序。

有什么问题?

import os.path
import subprocess as sp

AVL_FOLDER_PATH = '~/Desktop/AVL_VLM'
AVL_EXE_NAME = 'avl335'
avl_path = os.path.join(AVL_FOLDER_PATH, AVL_EXE_NAME)
avl_open_cmd = 'open ' + avl_path

avl_ps = sp.Popen([avl_open_cmd], stdin=sp.PIPE, stdout=None, stderr=None, shell=True)

def avl_command(cmd):
    cmd += '\n'
    cmd = cmd.encode('ascii')
    avl_ps.stdin.write(cmd)

avl_command('LOAD')
avl_command('/Users/vianneydubois/Desktop/AVL_VLM/test_gen.avl')
4

2 回答 2

1

输入/输出默认缓冲(https://docs.python.org/3/library/subprocess.html#subprocess.Popen

你可以bufsize=0设置Popen

0 表示无缓冲(读取和写入是一个系统调用,可以短返回)

https://docs.python.org/3/library/subprocess.html#subprocess.Popen

作为替代方案,您可以在写入后手动刷新缓冲区:

avl_ps.stdin.write(cmd)
avl_ps.stdin.flush()
于 2021-06-01T19:10:16.737 回答
0

这真的是你想要的吗?

import os.path
import subprocess as sp

AVL_FOLDER_PATH = '~/Desktop/AVL_VLM'
AVL_EXE_NAME = 'avl335'
avl_path = os.path.join(AVL_FOLDER_PATH, AVL_EXE_NAME)


def avl_command(cmd):
    return sp.run(cmd, capture_output=True, shell=True)

ret = avl_command(['open ', avl_path])
ret = avl_command(['LOAD','/Users/vianneydubois/Desktop/AVL_VLM/test_gen.avl'])

还是您的意思是:

ret = avl_command('open' + avl_path + '; LOAD /Users/vianneydubois/Desktop/AVL_VLM/test_gen.avl')
print(ret.stdout.decode())
于 2021-06-01T18:50:54.870 回答