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