【发布时间】:2021-06-01 17:37:22
【问题描述】:
我正在尝试使用 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')
【问题讨论】:
-
shell=True在这里可能是错误的,但是你的命令需要是['open', avl_path]。或许还可以参见Actual meaning ofshell=Trueinsubprocess... 并可能让 Python 为您扩展路径中的波浪号。 -
从我从 AVL 文档中可以看出,LOAD 命令和文件名应该在同一行,用空格分隔。您将它们完全放在不同的行上。
-
LOAD 命令和文件名可以在不同的行上,当我手动执行它时它可以工作,并且我已经看到使用每行命令的自动脚本,所以这不是我认为的问题所在。 ..
-
这里为什么需要
open?如果avl335实际上是您的可执行文件的名称,那么只需运行它。open是一个 MacOS 的东西,它试图找到与给定数据文件关联的可执行文件。 -
另外你的命令行中不能有空格。打开并且您的路径需要成为列表的一部分。
标签: python subprocess