Frage

Wie würde ich das Subprozess Modul in Python verwenden, um eine Befehlszeileninstanz von AHORN zu beginnen mit dem Hauptcode zu füttern und Rückkehrausgang? Zum Beispiel würde Ich mag:

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

Um den Wert von "2" zurück.

Das Beste, was ich gesehen habe, ist ein SAGE-Wrapper um die MAPLE Befehle, aber ich möchte nicht installieren und den Aufwand von SAGE für meine Zwecke nutzen.

War es hilfreich?

Lösung 2

Mit der Spitze von Alex Martelli (danke!), Habe ich kam mit einer ausdrücklichen Antwort auf meine Frage oben. Posting hier in der Hoffnung, dass andere nützlich sein können:

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

Das Parsen der Ausgabe wird als AHORN davon ausgeht, benötigt es notwendig, lange Ausgänge auf vielen Linien zu brechen. Dieser Ansatz hat den Vorteil, dass eine Verbindung offen AHORN für zukünftige Berechnung zu halten.

Andere Tipps

Der Versuch, ein Subprozess „interaktiv“ häufiger zu fahren als nicht läuft in Probleme mit dem Subprozess gewissen Puffer tun, die Blöcke Dinge.

Aus diesem Grund für solche Zwecke schlage ich vor, anstatt mit pexpect (überall aber Windows: wexpect unter Windows), die für diesen Zweck genau ausgelegt ist - lassen Sie Ihr Programm simulieren (aus der Sicht des subprocess) einen menschlichen Benutzer Eingabe Eingabe / Befehlen und Blick in den Ergebnissen an einem Terminal / Konsole.

Hier ist ein Beispiel dafür, wie mit einem Kommandozeilen-Programm interaktive IO zu tun. Ich habe etwas ähnliches eine Rechtschreibprüfung bauen auf der Grundlage des ispell Befehlszeilenprogramm:

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..

Das einzige Problem dabei ist, dass es sehr spröde ist und ein Trial-and-Error-Prozess, um sicherzustellen, dass Sie nicht jeden schlechten Eingang zu senden und all verschiedene Ausgabe Umgang mit dem Programm erzeugen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top