Ho bisogno di un modo per leggere tutti i caratteri attualmente disponibili nello stream creato da Popen o per scoprire quanti caratteri sono rimasti nel buffer.Come posso leggere tutti i dati disponibili dal sottoprocesso.Popen.stdout (non bloccante)?
Backround: Voglio controllare a distanza un'applicazione interattiva in Python. Finora ho usato Popen per creare un nuovo sottoprocesso:
process=subprocess.Popen(["python"],shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, cwd=workingDir)
(python non sto davvero iniziando, ma l'interfaccia attuale interattivo è simile.) Al momento ho letto 1 byte fino a rilevare che il processo di ha raggiunto il richiamo di ordine:
output = ""
while output[-6:]!="SCIP> ":
output += process.stdout.read(1)
sys.stdout.write(output[-1])
return output
Poi avviare un calcolo in via process.stdin.write("command\n")
. Il mio problema è che non posso controllare se il calcolo è finito o meno, perché non posso controllare, se gli ultimi caratteri nel flusso sono il prompt o no. read()
o read(n)
blocca il mio thread fino a quando non raggiunge EOF, cosa che non accadrà mai, perché il programma interattivo non si esaurirà finché non verrà comunicato. Cercare il prompt nel modo in cui il ciclo sopra non funzionerà, perché il prompt si verificherà solo dopo il calcolo.
La soluzione ideale mi consentirebbe di leggere tutti i caratteri disponibili dallo stream e restituire immediatamente una stringa vuota, se non c'è nulla da leggere.
Potrebbe pexpect http://www.noah.org/wiki/Pexpect fare ciò che ti serve? – Mark
Ho già esaminato quello, e sì, potrebbe. Ma se possibile vorrei una soluzione che funzionasse senza moduli esterni. – Perseids
Non sono sicuro che sia possibile fornire: http://www.python.org/dev/peps/pep-3145/ –