2015-07-15 11 views
5

मैं कमांड लाइन टूल (चलिए इसे 'एक्स' कहने का प्रयास कर रहा हूं) को किसी अन्य टूल को लपेटने की कोशिश कर रहा हूं (चलिए कॉल करें यह 'वाई')।Argparse: किसी भी वैकल्पिक तर्क (`-` या` --` से शुरू)

मैं कुछ मामलों विशेष रूप से संभाल, और अपने आप में से कुछ विकल्पों को जोड़ने, लेकिन मैं रीडायरेक्ट करने के लिए जो कुछ भी मैं उपकरण वाई को संभालने के लिए नहीं करना चाहती चाहते

अब तक मैं तर्क अनुप्रेषित करने में कामयाब रहे कि डॉन ' टी डैश के साथ आते हैं, उदाहरण के लिए X Y option1 option2 option3 बस Y option1 option2 option3 पर कॉल करेगा। मैं

यहाँ कोड (x.py) एक subparser Y और एक तर्क any इसे करने के लिए जोड़ कर ऐसा किया:

args = main_parser.parse_args() 
if args.parser_name == 'y': 
    command_string = ' '.join(['y'] + sys.argv[2:]) 
    os.system(command_string) 
:

main_parser = argparse.ArgumentParser() 
subparsers = main_parser.add_subparsers(dest="parser_name") 

y_subparser = subparsers.add_parser('y') 
y_options = y_subparser.add_argument('any', nargs='*') 
तब मेरे हैंडलर कोड में

, मैं यह नहीं

जब मैं python x.py y asdf zxcv qwer पर कॉल करता हूं तो यह काम करता है। x.py: error: unrecognized arguments: -option

मुझे लगता है कि सामान बस argparse साथ भी जटिल हो जाता है, तो मैं हमेशा sys.argv का ही उपयोग कर सकते हैं, लेकिन अगर आप जानते हैं कि यह संभव होना, साझा करें

जब मैं python x.py y asdf zxcv qwer -option फोन मैं त्रुटि मिलती है।

मैं भी Argparse कोड देख रहा हूं, जो थोड़ा घना है, और ऐसा लगता है कि ArgumentParser._parse_known_args सब कुछ (300 लाइनें) करता है। लेकिन इससे पहले कि मैं गहराई से जाऊं, मैंने सोचा कि शायद कोई जानता है कि यह कैसे करें - यदि नहीं, तो मैं अपनी खोज यहां पोस्ट करूंगा यदि किसी और को भी एक ही समस्या है।

+0

' '-' 'पार्सर कुछ भी है कि इस प्रकार के इलाज के लिए मजबूर करता तर्क, उदाहरण के लिए '' पायथन x.py y asdf zxcv qwer - -option'' – hpaulj

उत्तर

5

argparse के दस्तावेज़ में आप उपयोग कर सकते हैं argparse.REMAINDER:

>>> parser = argparse.ArgumentParser(prog='PROG') 
>>> parser.add_argument('--foo') 
>>> parser.add_argument('command') 
>>> parser.add_argument('args', nargs=argparse.REMAINDER) 
>>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split())) 
Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B') 

मैं इस समाधान का पाया भी subcommand तर्क

>>> parser = argparse.ArgumentParser(prog='PROG') 
>>> parser.add_argument('--foo') 
>>> parser.add_argument('command') 
>>> parser.add_argument('args', nargs=argparse.REMAINDER) 
>>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ --foobar'.split())) 
Namespace(args=['--arg1', 'XX', 'ZZ', '--foobar'], command='cmd', foo='B') 
+0

यूप। ने करदी। मैंने वास्तव में इसका इस्तेमाल किसी बिंदु पर किया था, लेकिन यह नहीं पता था कि उसने क्या किया। –

0

में धराशायी साथ इस काम:

के बजाय का उपयोग कर बस main_parser.parse_args() मैं यह

def remove_dashes_from_args(args): 
    return [arg.replace('-','#$%#$') for arg in args] 

main_parser.parse_args(replace_dashes_from_args(sys.argv[1:])) 

और फिर जब Y आदेश बुला रहा, कुछ भी बदलने की जरूरत नहीं है क्योंकि मैं पहले से ही sys.argv उपयोग कर रहा था:

if arg.parser_name == 'y': 
    os.system(' '.join(['y'] + sys.argv[2:])) 
संबंधित मुद्दे