argparse的嵌套选项

时间:2015-04-25 15:35:07

标签: python python-2.7 argparse

我希望我的python脚本根据特定的选择采用可变数量的参数。例如:

python run.py foo

python run.py bar X Y

选择选项bar需要两个额外的参数,比如整数输入,但foo不需要额外的参数。

import argparse

argparser = argparse.ArgumentParser()
# Allow user to choose test to run
argparser.add_argument("test", choices=['foo', 'bar'], help="You may choose foo or bar.")
...

但是如何指定bar所需的其他参数?附:我正在使用Python 2.7,因此,如果解决方案需要Python 3,那么在我的案例中它将不会有太多帮助。

1 个答案:

答案 0 :(得分:4)

你应该使用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')

用法:

>>> parser.parse_args(['foo'])
Namespace(target='foo')

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

请注意,您可以将target设置为例如一个函数并直接调用它。以下是一些示例代码(从Cactus' CLI中提取,但这是一种相当常见的模式):

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 for k, v in vars(args).items() if k != 'target'})