2012-12-24 44 views
7

Vì vậy, tôi đang cố gắng để lưu trữ đầu ra của một lệnh vào một biến. Tôi không muốn nó hiển thị đầu ra trong khi chạy lệnh mặc dù ...ngăn chặn subprocess.Popen từ hiển thị đầu ra trong python

Code tôi đã ngay bây giờ được như sau ...

def getoutput(*args): 
    myargs=args 
    listargs=[l.split(' ',1) for l in myargs] 
    import subprocess 
    output=subprocess.Popen(listargs[0], shell=False ,stdout=subprocess.PIPE) 
    out, error = output.communicate() 
    return(out,error) 


def main(): 

    a,b=getoutput("httpd -S") 

if __name__ == '__main__': 
    main() 

Nếu tôi đặt điều này trong một tập tin và thực hiện nó trên dòng lệnh. Tôi nhận được kết quả sau đây mặc dù tôi không có một tuyên bố in trong mã. Làm thế nào tôi có thể ngăn chặn điều này, trong khi vẫn lưu trữ đầu ra?

#python ./apache.py 
httpd: Could not reliably determine the server's fully qualified domain name, using xxx.xxx.xxx.xx for ServerName 
Syntax OK 

Trả lời

17

Những gì bạn thấy là đầu ra lỗi chuẩn, không phải đầu ra đầu ra tiêu chuẩn. Chuyển hướng Stderr được điều khiển bởi đối số hàm tạo stderr. Nó mặc định là None, có nghĩa là không có chuyển hướng nào xảy ra, đó là lý do tại sao bạn thấy kết quả này.

Thường là một ý tưởng tốt để giữ đầu ra stderr vì nó hỗ trợ gỡ lỗi và không ảnh hưởng đến chuyển hướng bình thường (ví dụ: |> chuyển hướng vỏ sẽ không chụp tiêu chuẩn theo mặc định). Tuy nhiên bạn có thể chuyển hướng nó ở một nơi khác giống như cách bạn làm stdout:

sp = subprocess.Popen(listargs[0], shell=False, 
    stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
output, error = sp.communicate() 

Hoặc bạn chỉ có thể thả stderr:

devnull = open(os.devnull, 'wb') #python >= 2.4 
sp = subprocess.Popen(listargs[0], shell=False, 
    stdout=subprocess.PIPE, stderr=devnull) 

#python 3.x: 
sp = subprocess.Popen(listargs[0], shell=False 
    stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) 
+0

Rất tiếc, tôi xấu, nhờ giải thích rõ ràng! – user1601716

+0

bạn nên sử dụng os.devnull cho tính di động cho cửa sổ – jtaylor

2

Bạn đang bắt đầu xuất hiện, nhưng bạn không bị bắt lỗi (lỗi chuẩn) mà tôi nghĩ là thư đến từ đâu.

output=subprocess.Popen(listargs[0], shell=False ,stdout=subprocess.PIPE, stderr=STDOUT) 

Điều đó sẽ đặt mọi thứ từ stderr vào cùng vị trí như stdout.

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