Pregunta

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

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

Para devolver el valor de "2".

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

¿Fue útil?

Solución 2

Con la punta de Alex Martelli (¡gracias!), He venido a una respuesta explícita a mi pregunta. Publicar aquí con la esperanza de que otros pueden 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 producción es necesaria como ARCE lo considere necesario para romper las salidas largas en muchas líneas. Este enfoque tiene la ventaja de mantener una conexión abierta a ARCE para el futuro cálculo.

Otros consejos

tratar de conducir un subproceso "interactiva" más a menudo que no se encuentra con problemas con el subproceso que hacen un poco de amortiguación, que bloquea las cosas.

Es por eso que para tales fines puedo sugerir en lugar de utilizar pexpect (por todas partes pero Windows: wexpect en Windows), que está diseñado exactamente para este propósito - dejar que su programa de simular (desde la perspectiva del subproceso) un usuario humano tecleando comandos de entrada / y mirando a los resultados en una terminal / consola.

Este es un ejemplo de cómo hacer IO interactivo con un programa de línea de comandos. He utilizado algo similar para construir un corrector ortográfico basado en la utilidad de línea de comandos 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 ensayo y error para asegurarse de que no está enviando ninguna mala entrada y manejo de todos los diferentes salida del programa podría producir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top