2011-11-23 13 views
107

मुझे लगता है कि यह आसान होना चाहिए लेकिन मुझे यह नहीं मिलता है।argparse: पहचानें कि कौन सा सबपरसर

मान लें मैं निम्नलिखित arparse पार्सर है:

import argparse 

parser = argparse.ArgumentParser(version='pyargparsetest 1.0') 
subparsers = parser.add_subparsers(help='commands') 

# all 
all_parser = subparsers.add_parser('all', help='process all apps') 

# app 
app_parser = subparsers.add_parser('app', help='process a single app') 
app_parser.add_argument('appname', action='store', help='name of app to process') 

मैं कैसे पहचान सकते हैं, जो subparser इस्तेमाल किया गया था? बुला:

print parser.parse_args(["all"]) 

मुझे एक खाली नाम स्थान देता है:

Namespace() 
+0

यह सवाल IMHO बेहतर जवाब तो मूल विचार एक है मिल जाएगा। –

उत्तर

56

संपादित करें: कृपया इस सवाल है, जो मेरा तुलना में बेहतर है और स्वीकार किए जाते हैं जवाब होना चाहिए करने के लिए quornian's answer देखते हैं।

argparse documentation के अनुसार parser.parse_args(...) के परिणाम में "केवल मुख्य पार्सर और उप पार्सर के लिए विशेषताओं को चुना जाएगा"। दुर्भाग्यवश यह निर्धारित करने के लिए पर्याप्त जानकारी नहीं हो सकती है कि कौन सा सब पार्सर इस्तेमाल किया गया था। दस्तावेज इस समस्या को हल करने के लिए उप पार्सर पर set_defaults(...) विधि का उपयोग करने की अनुशंसा करता है।

उदाहरण के लिए, मैं कॉल set_defaults() करने के लिए अपने कोड में शामिल किया है:

import argparse 

parser = argparse.ArgumentParser(version='pyargparsetest 1.0') 
subparsers = parser.add_subparsers(help='commands') 

# all 
all_parser = subparsers.add_parser('all', help='process all apps') 
all_parser.set_defaults(which='all') 

# app 
app_parser = subparsers.add_parser('app', help='process a single app') 
app_parser.add_argument('appname', action='store', help='name of app to process') 
app_parser.set_defaults(which='app') 

अब अगर आप चलाने

print parser.parse_args(["all"]) 

परिणाम है

Namespace(which='all') 

बाहर चेक add_subparsers() अधिक जानकारी और एक और उदाहरण के लिए प्रलेखन।

+5

'set_defaults' उपयोगी है, जैसे दस्तावेज़ों के उदाहरण में जहां यह किसी फ़ंक्शन पर उप-आदेश को बाध्य करने के लिए उपयोग करता है .. लेकिन 'add_parser (dest =' which ') यह करने के लिए" सही "तरीका प्रतीत होता है , क्योंकि इसे subcommand नाम – dbr

+1

@dbr Yep को दोहराने की आवश्यकता नहीं है, तो आप सही हैं। Quornian का जवाब स्वीकार किया जाना चाहिए। – srgerg

+0

@ डीआरबी, 'add_subparsers (dest =' जो '' होना चाहिए ' – smac89

202

dest को add_subparsers कॉल में जोड़ने का एक आसान समाधान है। इसमें कुछ समय दफन है आगे में documentation नीचे:

[...] यदि यह subparser कि लागू किया गया था के नाम की जांच करने के लिए आवश्यक है, add_subparsers को गंतव्य कीवर्ड तर्क() कॉल

काम करेंगे

अपने उदाहरण में बदल देते हैं:

subparsers = parser.add_subparsers(help='commands') 

साथ:

subparsers = parser.add_subparsers(help='commands', dest='command') 

अब अगर आप चलाएँ:

print parser.parse_args(["all"]) 

आप

Namespace(command='all') 
+0

यह सही तरीके से प्रतीत होता है, क्योंकि यह किसी भी अन्य तर्क पर' dest' param 'जैसा काम करता है (केवल यह' खींचा जा सकता है ' '--longopt' मान से)। 'Set_defaults' का उपयोग करना इसके लिए अनुचित लगता है (लेकिन अन्य चीजों के लिए उपयोगी) – dbr

+0

यह सही उत्तर है! उदाहरण के लिए अच्छा होगा कि "कमांड" मान का परीक्षण कैसे करें। –

+0

बीटीडब्ल्यू यदि आदेश के नाम से एक ही कक्षा में कार्य करता है तो कोई ऐसा कर सकता है: "getattr (self, args.command)()" इसे नाम से निष्पादित करने के लिए! –

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