2010-01-12 5 views
3

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

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

Чтобы вернуть значение «2».

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

+0

Не могли бы вы описать, как работает интерфейс командной строки Maple? Является ли это стандартным циклом чтения-оценки-печати, например Python, или есть команда '-c ', которую вы можете использовать, чтобы сразу оценить результаты команды? – LeafStorm

+0

Если бы процесс был простым, MAPLE имеет переключатель -c "command", но процесс не выходит (он запускает интерактивный режим). В идеале я хотел бы оставить трубу открытой - она ​​вычисляется в MAPLE, затем python затем снова возвращается в MAPLE, не запуская MAPLE каждый раз из-за длительной загрузки при ее запуске. – Hooked

ответ

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.

3

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

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

0

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

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