3

Pythonのサブプロセスモジュールを使用してMAPLEのコマンドラインインスタンスを開始し、出力をメインコードにフィードして返すにはどうすればよいですか?たとえば、私は欲しいです:

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

「2」の値を返します。

私が見た中で最高のものは、MAPLEコマンドのSAGEラッパーですが、SAGEのオーバーヘッドをインストールして使用したくありません。

4

3 に答える 3

3

サブプロセスを「インタラクティブに」駆動しようとすると、サブプロセスが何らかのバッファリングを実行する際に問題が発生し、ブロックされます。

そのため、そのような目的では、代わりにpexpect(Windows以外のすべて:Windows上のwexpect)を使用することをお勧めします。これは、まさにこの目的のために設計されています。プログラムで、入力/コマンドを入力して結果を確認する人間のユーザーを(サブプロセスの観点から)シミュレートできます。ターミナル/コンソールで。

于 2010-01-13T04:01:04.370 に答える
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は、長い出力を多くの行に分割する必要があると見なすため、出力の解析が必要です。このアプローチには、将来の計算のためにMAPLEへの接続を開いたままにしておくという利点があります。

于 2010-01-13T18:29:46.837 に答える
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..

これに関する唯一の問題は、非常に脆弱で試行錯誤のプロセスであり、不正な入力を送信したり、プログラムが生成する可能性のあるさまざまな出力をすべて処理したりしないようにすることです。

于 2010-01-13T18:02:57.157 に答える