2010-06-26 27 views
5

tôi có mã này:python subprocess ẩn stdout và chờ nó để hoàn thành

def method_a(self): 
    command_line = 'somtoolbox GrowingSOM ' + som_prop_path 
    subprocess.Popen(shlex.split(command_line)) 
    ...... 

def method_b(self): ..... 
.... 

và muốn tất cả các bạn thấy đấy, method_a có một tiến trình con được gọi chương trình somtoolbox. Nhưng chương trình này có một stdout dài, và tôi muốn giấu nó. Tôi cố gắng:

subprocess.Popen(shlex.split(command_line), stdout=subprocess.PIPE) 

Nhưng nó trở lại câu này:

cat: record error: Broked Pipe 

(đây là một bản dịch của câu portuguese: "mèo: Erro de gravação: Ống quebrado") (Tôi đến từ brazil)

Ngoài ra, tôi có các phương thức khác (như method_b ở đó), được gọi sau phương thức method_a và tis đang chạy trước khi tiến trình con hoàn thành quá trình.

Làm thế nào tôi có thể ẩn stdout ở tất cả (và không muốn nó ở bất cứ nơi nào), và làm cho các mã khác chờ đợi cho các subprocess để hoàn thành việc thực hiện?

Quan sát: Hộp công cụ somtoolbox là một chương trình java, cung cấp đầu ra dài cho thiết bị đầu cuối. Đã thử:

outputTuple = subprocess.Popen(shlex.split(command_line), stdout = subprocess.PIPE).communicate() 

nhưng liên tục quay lại đầu ra cho vỏ. Trợ giúp!

Trả lời

18

Cách tốt nhất để làm điều đó là chuyển hướng đầu ra vào/dev/null. Bạn có thể làm điều đó như thế này:

devnull = open('/dev/null', 'w') 
subprocess.Popen(shlex.split(command_line), stdout=devnull) 

Sau đó đợi cho đến khi nó được thực hiện, bạn có thể sử dụng .wait() trên đối tượng Popen, nhận bạn này:

devnull = open('/dev/null', 'w') 
process = subprocess.Popen(shlex.split(command_line), stdout=devnull) 
retcode = process.wait() 

retcode sau đó sẽ chứa mã trả về của quá trình.

BỔ SUNG: Như đã đề cập trong nhận xét, điều này sẽ không ẩn tiêu chuẩn. Để ẩn stderr cũng như bạn muốn làm như vậy:

devnull = open('/dev/null', 'w') 
process = subprocess.Popen(shlex.split(command_line), stdout=devnull, stderr=devnull) 
retcode = process.wait() 
+0

Nó không ẩn –

+0

@Gabriel Có lẽ bạn cần phải chuyển hướng stderr quá? –

+0

Đã hoạt động! Cảm ơn bạn rất nhiều! –

5

Popen.communicate được sử dụng để chờ quá trình chấm dứt. Ví dụ:

from subprocess import PIPE, Popen 
outputTuple = Popen(["gcc", "--version"], stdout = PIPE).communicate() 

sẽ trả về một chuỗi các chuỗi, một cho giá trị chuẩn và một cho đầu ra stderr.

+0

Nó không hoạt động. Xem cụm từ cuối cùng của tôi, để xem nó có thay đổi gì không. Một đầu ra của một chương trình java ... xem đó, làm ơn. –

+2

Chỉ cần thêm ', stderr = PIPE'. – AndiDog

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