Pythonのサブプロセスモジュールを使用してMAPLEのコマンドラインインスタンスを開始し、出力をメインコードにフィードして返すにはどうすればよいですか?たとえば、私は欲しいです:
X = '1+1;'
print MAPLE(X)
「2」の値を返します。
私が見た中で最高のものは、MAPLEコマンドのSAGEラッパーですが、SAGEのオーバーヘッドをインストールして使用したくありません。
Pythonのサブプロセスモジュールを使用してMAPLEのコマンドラインインスタンスを開始し、出力をメインコードにフィードして返すにはどうすればよいですか?たとえば、私は欲しいです:
X = '1+1;'
print MAPLE(X)
「2」の値を返します。
私が見た中で最高のものは、MAPLEコマンドのSAGEラッパーですが、SAGEのオーバーヘッドをインストールして使用したくありません。
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は、長い出力を多くの行に分割する必要があると見なすため、出力の解析が必要です。このアプローチには、将来の計算のためにMAPLEへの接続を開いたままにしておくという利点があります。
コマンドラインプログラムを使用してインタラクティブ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..
これに関する唯一の問題は、非常に脆弱で試行錯誤のプロセスであり、不正な入力を送信したり、プログラムが生成する可能性のあるさまざまな出力をすべて処理したりしないようにすることです。