2011-02-16 8 views
6

के साथ निकलता है मैं Windows Server 2008 R2 x64 बॉक्स पर Python 2.7.1 का उपयोग कर रहा हूं।पायथन: एक कमांड लाइन से आउटपुट प्राप्त करें जो nonzero निकास कोड

मैं एक कमांड लाइन प्रक्रिया का आउटपुट प्राप्त करने की कोशिश कर रहा हूं जो मुझे आवश्यक जानकारी को आउटपुट करने के बाद एक गैर-बाहर निकलने की स्थिति देता है।

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

आउटपुट देने वाले मामलों के खिलाफ इसे चलाने के लिए, लेकिन 0 से बाहर निकलने की स्थिति ठीक से काम करती है और मैं subprocess.check_output का उपयोग करके आउटपुट प्राप्त कर सकता हूं।

मेरी धारणा यह थी कि उत्पादन STDOUT को लिखा जा रहा था लेकिन अपवाद एसटीडीईआरआर से 'आउटपुट' खींचता है। मैंने check_output की कार्यक्षमता को फिर से कार्यान्वित करने का प्रयास किया है, लेकिन मुझे अभी भी आउटपुट पर कुछ भी नहीं मिलता है जब मुझे विश्वास है कि मुझे आउटपुट को STDOUT और STDERR में देखना चाहिए। (जहां 'कमांड', पैरामीटर सहित पूरा पाठ है, आदेश की मैं चला रहा हूँ मेरे वर्तमान कोड के नीचे है:

process = subprocess.Popen(command, stdout=subprocess.PIPE, 
stderr=subprocess.STDOUT, universal_newlines=True) 
output = process.communicate() 
retcode = process.poll() 
if retcode: 
    raise subprocess.CalledProcessError(retcode, image_check, output=output) 
    return output 

यह मैं देता चर उत्पादन में निम्नलिखित:

मेरी subprocess.Popen कोड है सही हूँ?

+0

'.communicate() 'के बाद, आप' process.poll() 'के बजाय सीधे' process.returncode' का उपयोग कर सकते हैं। – jfs

+0

पायथन के साथ कमांडलाइन से आउटपुट कैसे प्राप्त करें: http://stackoverflow.com/a/20456745/445131 –

उत्तर

8

आप कोड से टकराने जा सकता है नहीं है ठीक काम करता है। बाहर कर देता है कि प्रक्रिया है जो आपको बुला रहे हैं शायद CON को आउटपुट कर रहा है। निम्न उदाहरण

import subprocess 

def check_output(command): 
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) 
    output = process.communicate() 
    retcode = process.poll() 
    if retcode: 
      raise subprocess.CalledProcessError(retcode, command, output=output[0]) 
    return output 

command = "echo this>CON" 

print "subprocess -> " + subprocess.check_output(command, shell=True) 
print "native -> " + str(check_output(command)) 

try: 
    subprocess.check_output("python output.py", shell=True) 
except subprocess.CalledProcessError, e: 
    print "subproces CalledProcessError.output = " + e.output 

try: 
    check_output("python output.py") 
except subprocess.CalledProcessError, e: 
    print "native CalledProcessError.output = " + e.output 

आउटपुट

subprocess -> 
native -> ('', None) 
stderr subproces CalledProcessError.output = stdout 
native CalledProcessError.output = stderr stdout 

दुख की बात है, मैं कैसे इस मुद्दे को हल करने के लिए पता नहीं है। ध्यान दें कि subprocess.check_output परिणामों में केवल stdout से आउटपुट होता है। आपका check_output प्रतिस्थापन दोनों stderr और stdout आउटपुट होगा।

subprocess.check_output का निरीक्षण करने के बाद, यह वास्तव में केवल कॉलड युक्त आउटपुट के साथ एक कॉलडप्रोसेसर उत्पन्न करता है।

+1

मुझे पूरा यकीन है कि यह कहां जा रहा है।मैं विक्रेता से संपर्क करने में सक्षम था और कुछ अतिरिक्त अनियंत्रित पैरामीटर abotu पता चला जो nonzero निकास स्थितियों को होने से रोकते हैं, इसलिए मेरी पटकथा अब काम कर रही है, हालांकि मैं अभी भी जानना चाहता हूं कि CON से आउटपुट कैप्चर कैसे करें। – bplattenburg

1

आप stderr=subprocess.STDOUT की कोशिश की है के रूप में अजगर डॉक पेज में उल्लेख किया है:

भी परिणाम में मानक त्रुटि पर कब्जा करने के लिए उपयोग करें stderr = subprocess.STDOUT:

यहाँ एक परीक्षण कोड है :

import subprocess 

try: 
    subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True) 
except subprocess.CalledProcessError as e: 
    print 'e.output: ', e.output 


try: 
    subprocess.check_output('>&2 echo "errrrr"; exit 1', shell=True, stderr=subprocess.STDOUT) 
except subprocess.CalledProcessError as e: 
    print 'e.output: ', e.output 

उत्पादन:

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