2012-12-24 18 views
7

में आउटपुट प्रदर्शित करने से रोकें तो मैं एक चर के चर को एक चर में स्टोर करने की कोशिश कर रहा हूं। मैं अगर मैं एक फ़ाइल में इस डाल हालांकि आदेश चलाकर, जबकि यह उत्पादन प्रदर्शित करने के लिए नहीं चाहता ...subprocess को रोकें। पाइथन

कोड अभी मैं है के रूप में इस प्रकार है ...

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

और पर निष्पादित कमांड लाइन मुझे निम्न आउटपुट मिलता है भले ही मेरे पास कोड में प्रिंट स्टेटमेंट न हो। आउटपुट को संग्रहीत करते समय, मैं इसे कैसे रोक सकता हूं?

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

उत्तर

17

जो आप देख रहे हैं वह मानक-आउटपुट आउटपुट नहीं है, मानक-आउटपुट आउटपुट नहीं। Stderr पुनर्निर्देशन stderr कन्स्ट्रक्टर तर्क द्वारा नियंत्रित किया जाता है। यह None पर डिफ़ॉल्ट है, जिसका अर्थ है कि कोई पुनर्निर्देशन नहीं होता है, यही कारण है कि आप इस आउटपुट को देखते हैं।

आमतौर पर यह एक अच्छा विचार है, क्योंकि यह डिबगिंग एड्स और सामान्य पुनर्निर्देशन को प्रभावित नहीं करता stderr उत्पादन रखने के लिए (जैसे | और > खोल पुनर्निर्देशन डिफ़ॉल्ट रूप से stderr पर कब्जा नहीं होगा)। लेकिन अगर आप इसे कहीं और उसी तरह अनुप्रेषित कर सकते हैं आप stdout कार्य करें:

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

या फिर आप ड्रॉप कर सकते हैं 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

ओह, मेरे बुरा, कि समाशोधन के लिए धन्यवाद! – user1601716

+0

आपको खिड़कियों के पोर्टेबिलिटी के लिए os.devnull का उपयोग करना चाहिए – jtaylor

2

आप stdout को पकड़ने रहे हैं, लेकिन आप stderr (मानक त्रुटि), जो मुझे लगता है कि वह जगह है जहाँ उस संदेश से आ रही है पकड़ने नहीं कर रहे हैं।

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

कि stdout रूप में एक ही जगह में stderr से कुछ भी डाल देंगे।

संबंधित मुद्दे