Possible Duplicate:
Wrap subprocess' stdout/stderrPuoi creare un subprocesso python come output in subprocess come al solito, ma anche catturare l'output come una stringa?
In this question, hanan-n chiesto se era possibile avere un sottoprocesso pitone che emette a stdout pur mantenendo l'uscita in una stringa per successive elaborazioni. La soluzione in questo caso è stato quello di un ciclo su ogni linea di uscita e stampare manualmente:
output = []
p = subprocess.Popen(["the", "command"], stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
print(line)
output.append(line)
Tuttavia, questa soluzione non fa generalizzare al caso in cui si vuole fare questo per entrambe stdout e stderr, soddisfacendo la seguente:
- l'output output/error dovrebbe andare al processo padre output/error rispettivamente
- l'uscita dovrebbe essere fatto in tempo reale il più possibile (ma ho solo bisogno di accedere alle corde a la fine)
- la o rder tra le righe stdout e stderr non dovrebbe essere modificato (non sono abbastanza sicuro di come funzionerebbe anche se il sottoprocesso cancella le sue cache stdout e stderr a intervalli diversi; Supponiamo per ora che otteniamo tutto in blocchi belle che contengono le linee complete?)
ho guardato attraverso il subprocess documentation, ma non ho trovato nulla che possa raggiungere questo obiettivo. Il più vicino che ho trovato è quello di aggiungere stderr=subprocess.stdout
e utilizzare la stessa soluzione di cui sopra, ma poi perdiamo la distinzione tra output regolari ed errori. Qualche idea? Immagino che la soluzione, se ce ne sarà una, implicherà letture asincrone su p.stdout
e p.stderr
.
Ecco un esempio di quello che vorrei fare:
p = subprocess.Popen(["the", "command"])
p.wait() # while p runs, the command's stdout and stderr should behave as usual
p_stdout = p.stdout.read() # unfortunately, this will return '' unless you use subprocess.PIPE
p_stderr = p.stderr.read() # ditto
[do something with p_stdout and p_stderr]
Non vedo come questa tecnica (che include funzioni IO e oggetti stream) non sia generalizzata? – ninjagecko
Come suggerisco di far sì che il sottoprocesso stampi su stdout e stderr in tempo reale, ottenendo comunque l'output in una stringa alla fine, quindi? – pflaquerre