我希望我的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,那么在我的案例中它将不会有太多帮助。
答案 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'})