2013-02-06 20 views
31

के बजाय अपवाद फेंकना चाहता हूं मुझे नहीं लगता कि यह संभव है, लेकिन मैं खुद को Argparse से अपवादों को संभालना चाहता हूं।मैं पाइथन Argparse उपयोग

उदाहरण के लिए:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--foo', help='foo help', required=True) 
try: 
    args = parser.parse_args() 
except: 
    do_something() 

जब मैं इसे चलाने:

$ myapp.py 
usage: myapp --foo foo 
myapp: error: argument --foo is required 

लेकिन मैं इसे अपवाद में के बजाय गिर करना चाहते हैं।

+2

आप इसके लिए डिज़ाइन किए गए तर्क के लिए argparse का उपयोग नहीं कर रहे हैं। आप क्या करना चाहते हैं? –

+9

किसी अन्य प्रोजेक्ट को ट्यून करने के लिए, अन्यथा महान लाइब्रेरी काम करने के तरीके को बदलने की कोई बुरी बात नहीं है। – jdborg

+4

वास्तव में आप पहले से ही ऐसा कर सकते हैं। बस 'SystemExit' को पकड़ें और किसी अन्य ऑब्जेक्ट के साथ' sys.stderr' को प्रतिस्थापित करें। – Bakuriu

उत्तर

55

आप ArgumentParser उपवर्ग और एक त्रुटि तब होती है जब कुछ अलग करना error विधि ओवरराइड कर सकते हैं:

class ArgumentParserError(Exception): pass 

class ThrowingArgumentParser(argparse.ArgumentParser): 
    def error(self, message): 
     raise ArgumentParserError(message) 

parser = ThrowingArgumentParser() 
parser.add_argument(...) 
... 
+0

सोचा कि यह ऐसा कुछ होगा। स्पष्ट उत्तर के लिए धन्यवाद। – jdborg

+3

मैं इस तरह से कुछ से बचने की उम्मीद कर रहा था, हालांकि मुझे खुशी है कि यह एक विकल्प है। आप देखते हैं, जब मैं "त्रुटि: बहुत कम तर्क" अधिसूचना प्राप्त करता हूं, तो मैं सहायता मेनू मुद्रित करने का प्रयास कर रहा हूं; मेरे argparse सेटअप को सफलतापूर्वक चलाने के लिए कम से कम एक तर्क की आवश्यकता है, लेकिन मुझे लगता है कि यह आदेश मुद्रित करने के लिए विनम्र होगा कि उपयोगकर्ता के बिना "-h" पैरामीटर के साथ स्क्रिप्ट चलाने के लिए क्या आदेश हैं। कुछ ऐसा: 'parser.set_error ('बहुत कम तर्क', method_to_deal_with_error)' मुझे लगता है कि अगर मैं यह सुविधा चाहता हूं तो मैं हमेशा एक बग फाइल कर सकता हूं। धन्यवाद! – NuclearPeon

12
मेरे मामले में

, argparse प्रिंट 'भी कुछ तर्क' तो छोड़ दिया। Argparse कोड पढ़ने के बाद, मैंने पाया कि यह कुछ संदेश छपाई के बाद sys.exit() को बस कॉल करता है। sys.exit() कुछ भी नहीं करता है लेकिन SystemExit अपवाद फेंकता है, आप बस इस अपवाद को कैप्चर कर सकते हैं।

इसलिए यह देखने के लिए प्रयास करें कि यह आपके लिए काम करता है या नहीं।

try: 
     args = parser.parse_args(args) 
    except SystemExit: 
     .... your handler here ... 
     return 
+1

हां, यह विकल्प Bakuriu की टिप्पणी में ऊपर उल्लिखित है। 'ErrorRaisingArgumentParser' क्लास बनाने के लिए 'त्रुटि' को फिर से परिभाषित करने के साथ, unittesting' test_argparse.py' फ़ाइल इस दृष्टिकोण का उपयोग करती है। – hpaulj

+3

stderr पर त्रुटि संदेश फेंक दिया गया है। क्या इसे पकड़ने का कोई तरीका है? – Raj

+1

@Raj आप अस्थायी रूप से stderr को किसी अन्य स्ट्रीम/फ़ाइल ऑब्जेक्ट पर रीडायरेक्ट कर सकते हैं, उदाहरण के लिए: https://stackoverflow.com/a/6796752/2128769 – umi

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