Получение вывода MAPLE через Python - PullRequest
3 голосов
/ 13 января 2010

Как мне использовать модуль подпроцесса в Python для запуска экземпляра командной строки MAPLE для подачи и возврата вывода в основной код? Например, я хотел бы:

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

Для возврата значения «2».

Лучшее, что я видел, - это оболочка SAGE вокруг команд MAPLE, но я бы не хотел устанавливать и использовать служебные данные SAGE для своих целей.

Ответы [ 3 ]

3 голосов
/ 13 января 2010

Используя совет Алекса Мартелли (спасибо!), Я пришел к четкому ответу на мой вопрос. Публикация здесь в надежде, что другие могут найти полезным:

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 открыто для будущих вычислений.

3 голосов
/ 13 января 2010

Попытка управления подпроцессом "интерактивно" чаще всего приводит к проблемам с подпроцессом, выполняющим некоторую буферизацию, которая блокирует вещи.

Именно поэтому для таких целей я предлагаю вместо этого использовать pexpect (везде, кроме Windows: wexpect в Windows), который предназначен именно для этой цели - позволить вашей программе симулировать (из точка зрения подпроцесса) пользователь, набирающий ввод / команды и просматривающий результаты в терминале / консоли.

0 голосов
/ 13 января 2010

Вот пример того, как сделать интерактивный ввод-вывод с помощью программы командной строки. Я использовал нечто подобное для создания проверки орфографии на основе утилиты командной строки 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..

Единственная проблема с этим заключается в том, что это очень хрупкий процесс, основанный на методе проб и ошибок, который гарантирует, что вы не отправляете плохие входные данные и обрабатываете все различные выходные данные, которые может выдать программа.

...