2013-06-12 8 views
27

मैं यहां और सामान्य रूप से सबपरर्स उदाहरणों के आवंटन के माध्यम से खोज कर रहा हूं लेकिन यह प्रतीत होता है कि यह सरल बात नहीं है।argparse subparsers का सही तरीके से उपयोग कैसे करें?

मेरे पास दो अलग-अलग प्रकार हैं जिनमें से किसी को बाधाएं हैं इसलिए सोचा गया कि सबपरसर जाने का तरीका था। जैसे या तो "ए" या "बी" के लिए अनुमति देता है। यदि उपयोगकर्ता "ए" पास करता है तो उन्हें यह भी निर्दिष्ट करना होगा कि यह "ए 1" या "ए 2" है या नहीं। अगर वे सिर्फ "बी" पास करते हैं तो कुछ भी नहीं।

क्या मैं यह कर सकता हूं और मुझे तर्क दे सकता है कि किस प्रकार का "ए" पारित किया गया था या यदि यह सिर्फ "बी" था?

नीचे काम करता प्रतीत होता है लेकिन कुछ कारणों से उप-वर्ग के बाद कुछ भी पारित होने पर टूट जाता है।

उदा। एक linux टर्मिनल से

>> python test01.py -t A a1 -v 61 

साथ त्रुटियों ...

usage: test01.py a1 [-h] 
test01.py a1: error: unrecognized arguments: -v 

उम्मीद है कि है कि समझ में आता है।

कोड:

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help='types of A') 

parser.add_argument("-t", 
        choices = ["A", "B"], 
        dest = "type", 
        required=True, 
        action='store', 
        help="Some help blah blah") 

cam_parser = subparsers.add_parser('a1', help='Default') 
cam_parser.set_defaults(which='a1') 

cam_parser = subparsers.add_parser('a2', help='parse this instead of default') 
cam_parser.set_defaults(which='a2') 


parser.add_argument("-v", 
        nargs = '+', 
        required=True, 
        dest = "version", 
        type=int, 
        action='store', 
        help="some version help blah blah") 

argument = parser.parse_args() 

print argument.type 
print argument.version 

उत्तर

26

Subparsers पहले स्थितीय तर्क के मूल्य के आधार लागू कर रहे हैं, तो आपके कॉल की तरह

python test01.py A a1 -v 61 

लगेगा 'ए' उचित subparser से चलाता है , जिसे एक स्थितित्मक तर्क और -v विकल्प की अनुमति देने के लिए परिभाषित किया जाएगा।

क्योंकि argparse अन्यथा जिस क्रम में तर्क और विकल्प दिखाई दे सकते हैं पर कोई प्रतिबंध लागू नहीं होता है, और वहाँ संशोधित करने के लिए क्या तर्क/विकल्प दिखाई देते हैं एक बार पार्सिंग शुरू हो गया है हो सकता है (कि संशोधित कुछ शामिल कस्टम कार्यों कोई आसान तरीका है पार्सर उदाहरण काम कर सकते हैं), तो आपको -t ही बदलने पर विचार करना चाहिए:

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help='types of A') 
parser.add_argument("-v", ...) 

a_parser = subparsers.add_parser("A") 
b_parser = subparsers.add_parser("B") 

a_parser.add_argument("something", choices=['a1', 'a2']) 

-v के बाद से मुख्य पार्सर के लिए परिभाषित किया गया है, यह निर्दिष्ट किया जाना चाहिए से पहले तर्क यह बताता है कि जो subparser रहने के लिए प्रयोग किया जाता है तर्क दर्ज करना

+1

बहुत बहुत धन्यवाद। हालांकि मुझे अभी भी एक त्रुटि हो रही थी जब मैंने कुछ कारणों से पास किया- यानी यह उम्मीद की गई- और जब मैंने इसे पास किया तो मुझे अपनी पुरानी त्रुटि "अपरिचित तर्क" मिली। भले ही मैंने इसे स्थितित्मक तर्क से पहले पारित किया हो। कोई विचार? मैं एक समान उदाहरण खोजने की कोशिश कर रहा हूं लेकिन मुझे बहुत भाग्य नहीं मिला है। – user1571144

+0

तर्क से पहले है जो निर्दिष्ट करता है कि कौन सा सबपरसर उपयोगकर्ता के कोड में तर्क दर्ज कर रहा है या दोनों? – Nickpick

+0

यह 'group1 = parser.add_subparsers (help =' subparser group 1 ')' और 'group2 = parser.add_subparsers (help = 'subparser group 2') निष्पादित करता है 'त्रुटि' देता है: एकाधिक उप-कर्सर तर्क 'त्रुटि नहीं हो सकती है। मैं समूह उपसमूहों के लिए इसका उपयोग करने की उम्मीद कर रहा था। –

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