2010-01-12 72 views
3

我將如何使用Python中的子進程模塊來啓動MAPLE的命令行實例來提供並返回輸出到主代碼?例如,我想要:通過Python抓取MAPLE的輸出

X = '1+1;' 
print MAPLE(X) 

返回值「2」。

我見過的最好的是一個圍繞着MAPLE命令的SAGE包裝,但我不想爲我的目的安裝和使用SAGE的開銷。

+0

你能描述Maple命令行界面的工作方式嗎?它是像Python這樣的標準讀取評估打印循環,還是有一個'-c「命令」'開關,您可以使用它來立即評估命令的結果? – LeafStorm 2010-01-12 23:49:59

+0

如果過程很簡單,MAPLE確實有一個-c「命令」開關,但該過程不會退出(它運行交互模式)。理想情況下,我希望將管道打開 - 即在MAPLE中計算,然後再由python再次返回到MAPLE,而不必每次啓動MAPLE,因爲它在啓動時需要很長的加載時間。 – Hooked 2010-01-13 02:24:23

回答

3

使用Alex Martelli的提示(謝謝!),我想出了一個明確的答案。在希望別人可能會覺得有用在這裏發帖:

import pexpect 
MW = "/usr/local/maple12/bin/maple -tu" 
X = '1+1;' 
child = pexpect.spawn(MW) 
child.expect('#--') 
child.sendline(X) 
child.expect('#--') 
out = child.before 
out = out[out.find(';')+1:].strip() 
out = ''.join(out.split('\r\n')) 
print out 

輸出的解析需要楓認爲有必要長期輸出分手到多條線路。這種方法的優點是保持與MAPLE的連接,以便將來進行計算。

3

試圖以「交互式」的方式驅動一個子過程,往往會遇到子過程做一些緩衝的問題,這會阻礙事物的發展。因此,我建議使用pexpect(Windows上的所有地方:wexpect在Windows上),這是專門爲此目的而設計的 - 讓您的程序模擬(從子進程的角度來看)用戶輸入輸入/命令並在終端/控制檯上查看結果。

0

下面是如何使用命令行程序執行交互式IO的示例。我使用了類似的基礎上,ispell命令行工具來構建一個拼寫檢查的內容:

f = popen2.Popen3("ispell -a") 
f.fromchild.readline() #skip the credit line 

for word in words: 
    f.tochild.write(word+'\n') #send a word to ispell 
    f.tochild.flush() 

    line = f.fromchild.readline() #get the result line 
    f.fromchild.readline() #skip the empty line after the result 

    #do something useful with the output: 
    status = parse_status(line) 
    suggestions = parse_suggestions(line) 
    #etc.. 

與此唯一的問題是,它是非常脆弱和試錯的過程,以確保你不發送任何不良的輸入和處理程序可能產生的所有不同輸出。