2013-02-23 58 views
0

我有一个shell命令'fst-mor'。它以文件形式存在一个参数,例如NOUN.A这是一个lex文件或什么的。最后的命令:fst-mor NOUN.A从python调用多级命令/程序

然后它生成以下的输出:

analyze>INPUT_A_STRING_HERE 
OUTPUT_HERE 

现在我希望把调用FST-MOR从我的Python脚本,然后输入字符串,并希望回到脚本输出。

到目前为止,我有:

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

回答

3

你想捕捉其他命令的输出。为此,请使用subprocess module

import subprocess 

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

如果你的命令需要交互输入,你有两个选择:

  • 使用subprocess.Popen()对象,而stdin参数设置为subprocess.PIPE和写入输入到可用的标准输入管道。对于一个输入参数,这通常就足够了。研究为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() 
    
+0

它再次要求我输入INPUT_STRING。我不想在终端上输入。我希望从脚本中获取该INPUT_STRING,并将该OUTPUT_STRING返回给脚本 – 2013-02-23 15:26:59

+0

@AkshatGoel:稍微扩展答案。如果你可以给'fst-mor'命令更多的命令行参数,它可能会更容易。 – 2013-02-23 15:31:46

+0

谢谢你!但编辑的答案也没有帮助。如果你有时间或稍后可以发表详细的代码,你可以请吗?我可以用更简单的术语来解释这个问题。您正在从该脚本中调用典型的codechef或spoj程序,并且还希望从脚本中输入程序的'test','input'变量并在脚本中检索结果。 – 2013-02-23 15:36:13

-1

你应该使用子模块subprocess module

在您的例子,你可能会遇到:

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

-1为什么你发布一个已经给出的答案的确切副本? – jurgenreza 2013-02-23 15:26:20

+0

并发性问题:) – user2079098 2013-02-23 15:27:39

1

你可以尝试:

from subprocess import Popen, PIPE 

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

谢谢你!我已经提出了答案,但要公平,我必须接受Martijn的回答! :) 万分感谢! :) – 2013-02-23 15:57:18

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

注意,传达它运行后会关闭流,所以你要提前了解你的一切命令,此方法才能正常工作。在stdin关闭之前,pipe.stdout似乎不会刷新?我很好奇,如果有一种方法,我失踪了。