2012-04-20 35 views
25

Đối với lệnh sau:Đàn áp đầu ra trong python subprocess gọi

subprocess.call(shlex.split(
      """/usr/local/itms/bin/iTMSTransporter -m lookupMetadata 
       -apple_id %s -destination %s"""%(self.apple_id, self.destination)) 

It in toàn bộ sản lượng vào cửa sổ Terminal. Làm thế nào tôi sẽ ngăn chặn TẤT CẢ đầu ra ở đây? Tôi đã thử làm subprocess.call(shlex.split(<command> > /dev/null 2&1)), nhưng nó không tạo ra kết quả cần thiết. Làm thế nào tôi sẽ làm điều này ở đây?

Trả lời

35

Bạn có thể sử dụng các thông số stdout=stderr= để subprocess.call() chỉ đạo stdout hoặc stderr đến một bộ mô tả tập tin bạn đã chọn. Vì vậy, có lẽ một cái gì đó như thế này:

import os 

devnull = open(os.devnull, 'w') 
subprocess.call(shlex.split(
    '/usr/local/itms/bin/iTMSTransporter -m lookupMetadata ' 
    '-apple_id %s -destination %s' % (self,apple_id, self.destination)), 
    stdout=devnull, stderr=devnull) 

Sử dụng subprocess.PIPE, nếu bạn không đọc từ đường ống, có thể gây ra chương trình của bạn để ngăn chặn nếu nó tạo ra rất nhiều đầu ra.

+27

bạn chỉ có thể sử dụng os.devnull –

+3

Hey nhìn tôi đã học được điều gì đó. – larsks

+1

Bạn sử dụng os.devnull chính xác như thế nào để cải thiện câu trả lời này? Đối với tôi đó chỉ là chuỗi '/ dev/null', không chính xác là loại cải tiến đảm bảo 10 upvotes. – RussellStewart

2

Điều gì đã hiệu quả đối với tôi là phụ thêm 2>/dev/null vào cuối lệnh.

+0

Đối với người đọc trong tương lai: cách tiếp cận này không được đảm bảo để hoạt động trên tất cả nền tảng/hệ vỏ, mặc dù nó có thể hoạt động trên mọi thứ gần đây và POSIX-y. –

+0

(cũng vậy, điều này chỉ làm việc với 'shell = True', mà bạn muốn tránh khi có thể) – larsks

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