argparse 的嵌套选项

Nested options with 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 所需的额外参数? P.S。我正在使用 Python 2.7,所以如果一个解决方案需要 Python 3,它对我的​​情况没有多大帮助。

你应该使用子解析器:

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'})