从python调用多级命令/程序

时间:2013-02-23 15:20:13

标签: python shell

我有一个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")

4 个答案:

答案 0 :(得分:3)

您想要捕获另一个命令的输出。请使用subprocess 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')
    
  • 使用pexpect library来推动流程。通过查找模式是它生成的输出,您可以创建与子流程更复杂的交互:

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

答案 1 :(得分:1)

你可以尝试:

from subprocess import Popen, PIPE

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

答案 2 :(得分:0)

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

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:])

请注意,通信将在运行后关闭流,因此您必须提前知道所有命令才能使此方法生效。似乎pipe.stdout在stdin关闭之前不会刷新?我很好奇是否有办法让我失踪。

答案 3 :(得分:-1)

您应该使用子流程模块subprocess module

在您的示例中,您可能会运行:

subprocess.check_output(["fst-mor", "NOUN.A"])