在Python中使用子流程时输入不起作用

2024-05-23 23:29:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我试图写入AVL的命令是LOAD,后跟输入文件的绝对路径

这是我第一次使用子流程模块,所以我可能只是忘记了某个重要的选项。我正在macOS上用Python3.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')

Tags: 模块pathimport命令程序cmd终端软件
2条回答

默认情况下,输入/输出是缓冲的(https://docs.python.org/3/library/subprocess.html#subprocess.Popen

您可以在Popen中设置bufsize=0

0 means unbuffered (read and write are one system call and can return short)

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

或者,您可以在写入后手动刷新缓冲区:

avl_ps.stdin.write(cmd)
avl_ps.stdin.flush()

这真的是你想要的吗

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())

相关问题 更多 >