Agarrando la salida de MAPLE a través de Python

¿Cómo usaría el módulo de subproceso en Python para iniciar una instancia de línea de comandos de MAPLE para alimentar y devolver la salida al código principal? Por ejemplo me gustaría:

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

Para devolver el valor de “2”.

Lo mejor que he visto es una envoltura de SAGE alrededor de los comandos de MAPLE, pero me gustaría no instalar y usar la sobrecarga de SAGE para mis propósitos.

Tratar de conducir un subproceso “interactivamente” la mayoría de las veces se encuentra con problemas con el subproceso que realiza algunos búferes, lo que bloquea las cosas.

Es por eso que para tales propósitos sugiero usar pexpect (en todas partes excepto en Windows: wexpect en Windows), que está diseñado exactamente para este propósito: permite que su progtwig simule (desde el punto de vista del subproceso) un usuario humano escribiendo entradas / comandos y observando los resultados. en una terminal / consola.

Usando la sugerencia de Alex Martelli (¡gracias!), Se me ocurrió una respuesta explícita a mi pregunta. Publicar aquí con la esperanza de que otros puedan encontrar útil:

 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 

El análisis de la salida es necesario, ya que MAPLE considera necesario dividir las salidas largas en muchas líneas. Este enfoque tiene la ventaja de mantener una conexión abierta a MAPLE para futuros cálculos.

Aquí hay un ejemplo de cómo hacer un IO interactivo con un progtwig de línea de comandos. Utilicé algo similar para construir un corrector ortográfico basado en la utilidad de línea de comandos de 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.. 

El único problema con esto es que es muy frágil y un proceso de prueba y error para asegurarse de que no está enviando ninguna entrada incorrecta y de manejar todas las salidas diferentes que podría producir el progtwig.