質問

どのように私はメインのコードに出力を供給して返すためにMAPLEのコマンドラインインスタンスを起動するPythonでsubprocessモジュールを使うのでしょうか?たとえば、私がしたい:

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

"2" の値を返すようにします。

私が見た中で最高のは、MAPLEコマンド周りSAGEラッパーですが、私は私の目的のためにSAGEのオーバーヘッドをインストールして使用していたいと思います。

役に立ちましたか?

解決 2

アレックスマルテッリ(ありがとう!)からヒントを使用して、私は私の質問に明確な答えを思い付いてきました。他の人が役に立つかもしれません期待してここに投稿:

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は、多くのライン上に長い出力を分割することが必要と認めるとして

出力の解析が必要とされています。このアプローチは、将来の計算のためMAPLEへのオープン接続を維持するという利点があります。

他のヒント

サブプロセスを駆動しようとすると、「対話的」少なからず、いくつかのバッファリングを行うサブプロセスの問題、ブロックの物事に実行されます。

pexpect に(どこでもしかし、Windowsの使用することをお勧めする理由

それがありますhref = "http://code.google.com/p/wexpect/downloads/list" のrel = "nofollowをnoreferrer"> wexpect を、この目的のために正確に設計されたWindows)、上の - あなたのプログラムのシミュレートをさせます(サブプロセスの観点から)人間のユーザ入力/コマンドを入力し、端末/コンソールで結果を見ます。

ここでは、コマンドラインプログラムとの対話型の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..

これで唯一の問題は、それはあなたが任意の不正な入力を送信し、プログラムを作ることができるすべての種類の出力を処理していないことを確認することは非常に脆く、試行錯誤のプロセスであるということです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top