2011-02-03 10 views
63

आम तौर पर एक रन() कॉल के रूप में फैब्रिक छोड़ देता है, एक गैर-शून्य निकास कोड देता है। कुछ कॉल के लिए, हालांकि, यह उम्मीद की जाती है। उदाहरण के लिए, जब PNGOut फ़ाइल को संपीड़ित करने में असमर्थ होता है तो 2 का त्रुटि कोड देता है।क्या रिमोट शैल में चलाने के लिए फैब्रिक का उपयोग करते समय मैं त्रुटि कोड पकड़ सकता हूं?

वर्तमान में मैं केवल इस तर्क को खोल तर्क (do_something_that_fails || true या do_something_that_fails || do_something_else) का उपयोग करके रोक सकता हूं, लेकिन मैं अपने तर्क को सादे पायथन (जैसा कि कपड़ा वादा है) में रखने में सक्षम हूं।

क्या कोई त्रुटि कोड जांचने का कोई तरीका है और फैब्रिक आतंक होने और मरने के बजाय इसका प्रतिक्रिया है? मैं अभी भी अन्य कॉल के लिए डिफ़ॉल्ट व्यवहार चाहता हूं, इसलिए पर्यावरण को संशोधित करके अपने व्यवहार को बदलना एक अच्छा विकल्प नहीं लगता है (और जहां तक ​​मुझे याद है, आप इसे केवल वैसे भी मरने के बजाए चेतावनी देने के लिए इसका उपयोग कर सकते हैं)।

+2

इससे पहले कि कोई यह कोई डुप्लिकेट के निशान: [इस सवाल से संबंधित है] (http://stackoverflow.com/questions/3876936/how-to-continue-the-task-when- कपड़े-मिल-ए-एरर), लेकिन जैसा कि मैंने कहा, मैं त्रुटियों के लिए _react_ करना चाहता हूं, उन्हें अनदेखा नहीं करना चाहता हूं। –

+0

वर्तमान में स्वीकृत उत्तर दिनांकित है। जुलाई 2013 से, एक पर्यावरण परिवर्तनीय रहा है जो आपको यह निर्दिष्ट करने की अनुमति देता है कि कोई त्रुटि उत्पन्न होने पर कौन सा अपवाद उठाया जाना चाहिए (डिफ़ॉल्ट एक 'SystemExit' है, जो अपवाद का वंशज नहीं है, यही कारण है कि यह आमतौर पर आपके प्रोग्राम को क्रैश करने का कारण बनता है)। मेरा उत्तर देखें: http://stackoverflow.com/a/25293275/901641 – ArtOfWarfare

+0

//, मुझे उत्सुकता है कि कैसे Invoke इसे संभालेगा। –

उत्तर

87

आप settings संदर्भ प्रबंधक और warn_only सेटिंग का उपयोग करके गैर शून्य बाहर निकलने के कोड पर निरस्त किया जा रहा रोका जा सकता है:

from fabric.api import settings 

with settings(warn_only=True): 
    result = run('pngout old.png new.png') 
    if result.return_code == 0: 
     do something 
    elif result.return_code == 2: 
     do something else 
    else: #print error to user 
     print result 
     raise SystemExit() 

अद्यतन: मेरा जवाब पुरानी हो चुकी है। नीचे टिप्पणियां देखें।

+0

आपको return_code की जांच करने की भी आवश्यकता नहीं है, कार्य के सफलता की स्थिति के आधार पर परिणाम का मूल्य बूलियन सत्य या गलत के रूप में मूल्यांकन करता है। Http: //docs.fabfile.org/en/1.7/api/core/operations .html # fabric.operations.run –

+1

यह टाइमआउट त्रुटियों के लिए काम नहीं करता है। "सेटिंग के साथ" या बिना किसी प्रयास के/उसके साथ, फैब्रिक अभी भी पूरी तरह से बाहर निकलता है। – Cerin

+0

-1: यह उत्तर दिनांकित है - जुलाई 2013 से यह निर्दिष्ट करना संभव है कि त्रुटि को कॉल करने पर कौन सा अपवाद कहा जाता है। मेरा उत्तर यहां देखें: http: // stackoverflow।कॉम/ए/25293275/901641 – ArtOfWarfare

4

स्पष्ट रूप से पर्यावरण के साथ गड़बड़ उत्तर उत्तर है।

fabric.api.settings व्यक्तिगत विवरणों पर लागू करने के लिए संदर्भ प्रबंधक (with के साथ) के रूप में उपयोग किया जा सकता है। run(), local() और sudo() कॉल की वापसी मान बस शेल कमांड के उत्पादन में नहीं है, लेकिन यह भी विशेष गुण (return_code और failed) कि त्रुटियों पर प्रतिक्रिया के लिए अनुमति देते हैं।

मुझे लगता है कि मैं subprocess.Popen या पायथन के सामान्य अपवाद हैंडलिंग के व्यवहार के करीब कुछ ढूंढ रहा था।

28

हाँ, आप कर सकते हैं। बस पर्यावरण के abort_exception बदलें। उदाहरण के लिए:

from fabric.api import settings 

class FabricException(Exception): 
    pass 

with settings(abort_exception = FabricException): 
    try: 
     run(<something that might fail>) 
    except FabricException: 
     <handle the exception> 

प्रलेखन abort_exception पर here है।

+1

हालांकि, यह कमांड के एक्ज़िट कोड तक पहुंच प्रदान नहीं करता है। –

+0

@AlanPlum - आप अपवाद संदेश प्राप्त कर सकते हैं ... लेकिन आप सही हैं, मुझे निकास कोड प्राप्त करने का कोई तरीका नहीं दिख रहा है। – ArtOfWarfare

1

कोशिश इस

from fabric.api import run, env 
env.warn_only = True # if you want to ignore exceptions and handle them yurself 

command = "your command" 
x = run(command, capture=True) # run or local or sudo 
if(x.stderr != ""): 
    error = "On %s: %s" %(command, x.stderr) 
    print error 
    print x.return_code # which may be 1 or 2 
    # do what you want or 
    raise Exception(error) #optional 
else: 
    print "the output of %s is: %s" %(command, x) 
    print x.return_code # which is 0 
+2

मैंने उपर्युक्त निम्नलिखित परिणामों के साथ प्रयास किया: 'TypeError: run() को फैब्रिक 1.10.2 और पैरामीको 1.15.2 के साथ एक अप्रत्याशित कीवर्ड तर्क 'कैप्चर' मिला। – DMfll

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

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