Domanda

Come faccio a utilizzare il modulo sottoprocesso in Python per avviare un'istanza riga di comando di acero per nutrire e tornare uscita al codice principale? Per esempio mi piacerebbe:

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

Per restituire il valore di "2".

Il migliore che ho visto è un wrapper SAGE attorno ai comandi acero, ma mi piacerebbe non installare e utilizzare il sovraccarico di SAGE per i miei scopi.

È stato utile?

Soluzione 2

Con la punta da Alex Martelli (grazie!), Ho si avvicinò con una risposta esplicita alla mia domanda. Distacco qui nella speranza che altri possono trovare utili:

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

Il parsing dell'output è necessaria l'acero ritenga necessario rompere uscite lunghe su molte linee. Questo approccio ha il vantaggio di mantenere una connessione aperta per Maple per il futuro calcolo.

Altri suggerimenti

cercando di guidare un sottoprocesso "interattivo" il più delle volte non si imbatte in problemi con la sottoprocesso facendo alcuni buffer, che blocca le cose.

Questo è il motivo per tali scopi suggerisco invece di usare pexpect (in tutto il mondo, ma di Windows: wexpect su Windows), che è stato progettato esattamente per questo scopo - lasciando il vostro programma di simulazione (dal punto di vista del sottoprocesso) un utente umano digitando ingresso / comandi e guardando i risultati a un terminale / console.

Ecco un esempio di come fare IO Interactive con un programma a riga di comando. Ho usato qualcosa di simile per costruire un correttore ortografico in base alla linea di comando 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..

L'unico problema è che è molto fragile e un processo di tentativi ed errori per assicurarsi che non sta inviando alcun input male e gestione di tutte le output diverso il programma potrebbe produrre.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top