python - Nested options with argparse -


i'd have python script take variable number of arguments depending on particular choice. example:

python run.py foo

python run.py bar x y

where choosing option bar requires 2 additional arguments, integer inputs, foo requires no additional arguments.

import argparse  argparser = argparse.argumentparser() # allow user choose test run argparser.add_argument("test", choices=['foo', 'bar'], help="you may choose foo or bar.") ... 

but how can specify additional arguments required bar? p.s. i'm working python 2.7, if solution requires python 3, won't in case.

you should use subparsers:

import argparse  parser = argparse.argumentparser() subparsers = parser.add_subparsers(title='subcommands')  parser_foo = subparsers.add_parser('foo') parser_foo.set_defaults(target='foo')  parser_bar = subparsers.add_parser('bar') parser_bar.add_argument('more') parser_bar.set_defaults(target='bar') 

usage:

>>> parser.parse_args(['foo']) namespace(target='foo')  >>> parser.parse_args(['bar', '123']) namespace(target='bar', more='123') 

note set target e.g. function , call directly. here's sample code (extracted cactus' cli, that's rather common pattern):

parser = argparse.argumentparser()  subparsers = parser.add_subparsers(title = 'subcommands')  parser_create = subparsers.add_parser('create') parser_create.add_argument('path') parser_create.add_argument('-s', '--skeleton') parser_create.set_defaults(target=create)  parser_build = subparsers.add_parser('build') parser_build.set_defaults(target = build)  args = parser.parse_args() args.target(**{k: v k, v in vars(args).items() if k != 'target'}) 

Comments

Popular posts from this blog

asp.net mvc - SSO between MVCForum and Umbraco7 -

Python Tkinter keyboard using bind -

ubuntu - Selenium Node Not Connecting to Hub, Not Opening Port -