2013-02-23 44 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似乎不會刷新?我很好奇,如果有一種方法,我失蹤了。