2010-12-30 4 views
5

मैं cmd ​​args को संभालने के लिए argparse का उपयोग कर रहा हूं, मैं चाहता हूं कि कोई तर्क निर्दिष्ट नहीं है, तो सहायता संदेश मुद्रित करें, लेकिन अब पार्स एक त्रुटि आउटपुट करेगा, और फिर बाहर निकलें। मेरी कोड है:त्रुटि के बजाय पार्सर प्रिंट सहायता संदेश को कैसे छोड़ें और

def main(): 
    print "in abing/start/main" 
    parser = argparse.ArgumentParser(prog="abing")#, usage="%(prog)s <command> [args] [--help]") 
    parser.add_argument("-v", "--verbose", action="store_true", default=False, help="show verbose output") 

    subparsers = parser.add_subparsers(title="commands") 

    bkr_subparser = subparsers.add_parser("beaker", help="beaker inspection") 
    bkr_subparser.set_defaults(command=beaker_command) 
    bkr_subparser.add_argument("-m", "--max", action="store", default=3, type=int, help="max resubmit count") 
    bkr_subparser.add_argument("-g", "--grain", action="store", default="J", choices=["J", "RS", "R", "T", "job", "recipeset", "recipe", "task"], type=str, help="resubmit selection granularity") 
    bkr_subparser.add_argument("job_ids", nargs=1, action="store", help="list of job id to be monitored") 

    et_subparser = subparsers.add_parser("errata", help="errata inspection") 
    et_subparser.set_defaults(command=errata_command) 
    et_subparser.add_argument("-w", "--workflows", action="store_true", help="generate workflows for the erratum") 
    et_subparser.add_argument("-r", "--run", action="store_true", help="generate workflows, and run for the erratum") 
    et_subparser.add_argument("-s", "--start-monitor", action="store_true", help="start monitor the errata system") 
    et_subparser.add_argument("-d", "--daemon", action="store_true", help="run monitor into daemon mode") 
    et_subparser.add_argument("erratum", action="store", nargs=1, metavar="ERRATUM", help="erratum id") 

    if len(sys.argv) == 1: 
     parser.print_help() 
     return 

    args = parser.parse_args() 
    args.command(args) 

    return 

मैं यह कैसे कर सकते हैं? धन्यवाद।

+0

* अब पार्स एक त्रुटि आउटपुट करेगा, और फिर बाहर निकलें * - आपको क्या त्रुटि मिलती है? –

+0

यह त्रुटि है: बहुत कम तर्क – fluter

उत्तर

3

एक समाधान में argparse.ArgumentParser subclassing और error() विधि को फिर से परिभाषित करने में शामिल है। वास्तव में, त्रुटि पर, ArgumentParser इसकी error() विधि को कॉल करता है। कस्टम तर्क पार्सिंग को argparse.ArgumentParser के बजाय उप-वर्ग के माध्यम से किया जा सकता है। एक मॉडल error() समारोह argparse के लिए स्रोत में पाया जाता है:

def error(self, message): 
    """error(message: string) 

    Prints a usage message incorporating the message to stderr and 
    exits. 

    If you override this in a subclass, it should not return -- it 
    should either exit or raise an exception. 
    """ 
    self.print_usage(sys.stderr) 
    self.exit(2, '%s: error: %s\n' % (self.prog, message)) 

यह इतना है कि कोड बुला parse_args() उपयोगकर्ता के साथ समस्याओं के आरोप लगते हैं, संभव उदाहरण के बजाय संदेश मुद्रण की, error() में एक अपवाद को बढ़ाने के लिए के लिए है मापदंडों।

मूल जवाब: टिप्पणी में स्पष्टीकरण के अनुसार, निम्नलिखित काम नहीं करता। हालांकि, यह सब-कमांड फ़ंक्शंस से सहायता संदेशों तक पहुंचने के लिए एक तंत्र प्रदान करता है:

आपके पास लगभग यह है: आपके *_command(args) फ़ंक्शंस में, आप args के आकार का परीक्षण कर सकते हैं और पर्याप्त नहीं होने पर त्रुटि संदेश प्रिंट कर सकते हैं तर्क।

आप स्वचालित रूप से उत्पन्न मदद का उपयोग करने के लिए, अपने आदेश कार्यों में चाहते हैं, तो आप इसे प्रत्येक आदेश के लिए subparsers गुजर, इसलिए तरह से प्राप्त कर सकते हैं:

args.command(subparsers, args) # Instead of args.command(args) 

प्रत्येक *_command() समारोह तो बस दो तर्क लेना चाहिए एक के बजाय।

subparsers.choices['beaker'].print_help() # or print_usage() 
उदाहरण के लिए

: स्वचालित रूप से उत्पन्न मदद के माध्यम से पहुँचा जा सकता है।

आप वैकल्पिक रूप से सीधे प्रत्येक उप आदेश दिनचर्या *_command() करने के लिए विशेष subparser पारित करने के लिए चुन सकते हैं:

args.command(subparsers.choices[sys.argv[1]], args) 

और फिर, प्रत्येक *_command(subparser, args) में, subparser.print_help() के साथ मदद के लिए प्रिंट।

+0

समस्या यह है कि यह त्रुटि होगी और parser.parse_args() को कॉल करते समय बाहर निकलेंगे, इसलिए अगर कोई तर्क प्रदान नहीं किया जाता है तो args.command (subparsers, args) को कॉल करने का कोई मौका नहीं है। – fluter

+1

@fluter: मैं देखता हूं। मैंने अपनी पोस्ट को समाधान के साथ अपडेट किया। :) – EOL

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