2012-03-03 37 views
9

tôi đọc mỗi thread tôi tìm thấy trên StackOverflow về cách gọi lệnh vỏ từ Python sử dụng subprocess, nhưng tôi không thể tìm thấy một câu trả lời mà áp dụng cho tình hình của tôi dưới đây:Shell ống với tiến trình con bằng Python

Tôi muốn làm như sau từ Python:

  1. Chạy lệnh shell command_1. Thu thập các đầu ra trong biến result_1

  2. Shell ốngresult_1 vào command_2 và thu thập kết quả trên result_2. Nói cách khác, chạy command_1 | command_2sử dụng kết quả mà tôi thu được khi chạy command_1trong bước trước

  3. Làm tương tự ống result_1 vào một lệnh thứ ba command_3 và nhận kết quả tại result_3.

Cho đến nay tôi đã cố gắng:

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

lý do có vẻ là rằng "echo " + result_1 không mô phỏng các quá trình lấy đầu ra của một lệnh cho đường ống.

Điều này có thể thực hiện bằng cách sử dụng quy trình con không? Nếu vậy, làm thế nào?

+2

Xem [ví dụ này trong tài liệu] (http://docs.python.org/library/subprocess.html#replacing-shell-pipeline) để biết cách thực hiện. –

+1

Cảm ơn @SvenMarnach, liệu điều đó vẫn cho phép tôi thu thập đầu ra của lệnh đầu tiên trong một biến Python? –

Trả lời

8

Bạn có thể làm:

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

thay cho phù hợp với đường ống.

+0

Điều này có vẻ tuyệt vời. Làm thế nào sẽ thay đổi ở trên nếu tôi muốn ống 'result_1' * một lần nữa * sang lệnh khác? –

+1

Tại thời điểm đó 'result_1' là một chuỗi. Bạn sẽ có thể lặp lại 3 dòng giống nhau bằng lệnh mới. –

Các vấn đề liên quan