2012-03-03 12 views
9

ho letto ogni thread che ho trovato su StackOverflow su come richiamare comandi di shell da Python utilizzando subprocess, ma non riuscivo a trovare una risposta che si applica alla mia situazione di seguito:tubazioni Shell con sottoprocesso in Python

vorrei fare il seguente da Python:

  1. Eseguire il comando shell command_1. Raccogliere l'output nella variabile result_1

  2. Shell tuboresult_1 in command_2 e raccogliere l'output sul result_2. In altre parole, eseguire command_1 | command_2usando il risultato che ho ottenuto durante l'esecuzione command_1nella fase precedente

  3. Eseguire la stessa tubazione result_1 in un terzo comando command_3 e raccogliendo il risultato in result_3.

Finora ho provato:

p = subprocess.Popen(command_1, stdout=subprocess.PIPE, shell=True) 

result_1 = p.stdout.read(); 

p = subprocess.Popen("echo " + result_1 + ' | ' + 
command_2, stdout=subprocess.PIPE, shell=True) 

result_2 = p.stdout.read(); 

il motivo sembra essere che "echo " + result_1 non simula il processo per ottenere l'output di un comando per tubazioni.

È possibile utilizzare il sottoprocesso? Se é cosi, come?

+2

Vedere [questo esempio nella documentazione] (http://docs.python.org/library/subprocess.html#replacing-shell-pipeline) per il modo giusto per farlo. –

+1

Grazie a @SvenMarnach, mi consentirebbe comunque di raccogliere l'output del primo comando in una variabile Python? –

risposta

8

si può fare:

pipe = Popen(command_2, shell=True, stdin=PIPE, stdout=PIPE) 
pipe.stdin.write(result_1) 
pipe.communicate() 

al posto della linea con il tubo.

+0

Sembra fantastico. Come cambierebbe la precedente se voglio reindirizzare 'result_1' * di nuovo * a un altro comando? –

+1

A quel punto 'result_1' è una stringa. Dovresti essere in grado di ripetere le stesse 3 righe con il nuovo comando. –

Problemi correlati