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'})
我想让我的 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'})