2012-03-03 13 views
9

Czytam każdy wątek znalazłem na StackOverflow na wywoływanie poleceń powłoki z użyciem subprocess Pythonie, ale nie mogę znaleźć odpowiedzi, które odnoszą się do mojej sytuacji poniżej:rurociągi Shell z podproces w Pythonie

Chciałbym zrobić następujące od Python:

  1. Uruchom polecenie powłoki command_1. Zebrać wyjście zmienną result_1

  2. Shell ruryresult_1 do command_2 i zbierać dane wyjściowe result_2. Innymi słowy, należy uruchomić command_1 | command_2pomocą rezultat że uzyskany po uruchomieniu command_1w etapie przed

  3. zrobić to samo orurowanie result_1 do trzeciej komendzie command_3 i zbieranie wynik w result_3.

Do tej pory próbowałem:

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(); 

powodem wydaje się być to, że "echo " + result_1 nie symulować proces uzyskiwania wyjście polecenia dla rurociągów.

Czy to w ogóle możliwe przy użyciu podprocesu? Jeśli tak to jak?

+2

Zobacz [ten przykład w dokumentacji] (http://docs.python.org/library/subprocess.html#replacing-shell-pipeline), aby uzyskać odpowiedni sposób. –

+1

Dzięki @SvenMarnach, czy to nadal pozwala mi gromadzić dane wyjściowe pierwszego polecenia w zmiennej Python? –

Odpowiedz

8

można zrobić:

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

zamiast linii z rurą.

+0

To wygląda świetnie. W jaki sposób powyższe zmiany zmienią się, jeśli chcę potokować 'result_1' * ponownie * do innego polecenia? –

+1

W tym miejscu 'result_1' jest ciągiem znaków. Powinieneś móc powtarzać te same 3 linie za pomocą nowego polecenia. –