从python调用多级命令/程序

2024-04-25 04:26:17 发布

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

我有一个shell命令'fst mor'。它采用文件形式的参数,例如NOUN.A,它是lex文件之类的。最后命令:fst-mor NOUN.A

然后产生以下输出:

analyze>INPUT_A_STRING_HERE
OUTPUT_HERE

现在我想从我的python脚本中调用fst mor,然后输入字符串并希望在脚本中返回输出。你知道吗

到目前为止,我已经:

import os
print os.system("fst-mor NOUN.A")

Tags: 文件命令脚本input参数stringhereos
3条回答

与另一个进程通信的示例:

pipe = subprocess.Popen(['clisp'],stdin=subprocess.PIPE, stdout=subprocess.PIPE)
(response,err) = pipe.communicate("(+ 1 1)\n(* 2 2)")
#only print the last 6 lines to chop off the REPL intro text. 
#Obviously you can do whatever manipulations you feel are necessary 
#to correctly grab the input here
print '\n'.join(response.split('\n')[-6:])

注意,communicate将在它运行后关闭流,因此您必须提前知道所有命令,此方法才能工作。好像管道.stdout在stdin关闭前不冲水?我很好奇是否有一条路是我错过的。你知道吗

您希望捕获另一个命令的输出。为此使用^{} module。你知道吗

import subprocess

output = subprocess.check_output('fst-mor', 'NOUN.A')

如果命令需要交互式输入,则有两个选项:

  • 使用subprocess.Popen()对象,将stdin参数设置为subprocess.PIPE,并将输入写入可用的stdin管道。对于一个输入参数,这就足够了。详细研究subprocess模块的文档,但基本的交互是:

    proc = subprocess.Popen(['fst-mor', 'NOUN.A'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    output, err = proc.communicate('INPUT_A_STRING_HERE')
    
  • 使用^{} library驱动进程。这样,您就可以通过查找模式来创建与子流程更复杂的交互,即子流程生成的输出:

    import pexpect
    
    py = pexpect.spawn('fst-mor NOUN.A')
    py.expect('analyze>')
    py.send('INPUT_A_STRING_HERE')
    output = py.read()
    py.close()
    

你可以试试:

from subprocess import Popen, PIPE

p = Popen(["fst-mor", "NOUN.A"], stdin=PIPE, stdout=PIPE)
output = p.communicate("INPUT_A_STRING_HERE")[0]

相关问题 更多 >