【发布时间】:2014-10-08 17:29:40
【问题描述】:
我正在尝试编写一个能够执行多个子命令的程序。 argparse 模块非常有用,但我认为它缺乏指定多个子命令的能力。例如,如果我有以下代码:
parser = argparse.ArgumentParser(prog='My Prog')
sub_parsers = parser.add_subparsers()
subcommand_a = sub_parsers.add_parser('subcommand_a', help='a help')
subcommand_a.add_argument('req1', help='required argument 1 help')
subcommand_a.add_argument('--opt1', help='option 1 help')
subcommand_a.add_argument('--opt2', nargs='+', help='option 2 help')
subcommand_b = sub_parsers.add_parser('subcommand_b', help='b help')
subcommand_b.add_argument('req1', help='required argument 1 help')
subcommand_b.add_argument('--opt1', help='option 1 help')
subcommand_b.add_argument('--opt2', help='option 2 help')
subcommand_b.add_argument('--opt3', nargs='+', help='option 3 help')
parser.parse_args()
我无法在命令行上同时指定 subcommand_a 和 subcommand_b。我一次只能做其中一个。我想这将需要自定义操作,甚至可能需要子类化 argparse,但我不确定从哪里开始。我希望能够像下面这样调用这个程序:
./prog.py subcommand_a FOO --opt1=bar --opt2 1 2 3 -- subcommand_b BAR --opt1='foo' --opt3 a b c --
有什么想法吗?
【问题讨论】:
-
使用
nargs='+',您需要--opt2 1 2 3,而不是--opt2=1 2 3。后者将1分配给opt2,但对2 3不执行任何操作。 -
你应该调查docopt。它是一个使用您的手册页来解析参数和选项的框架。它使执行更复杂的参数规范变得更加容易,使它们更易于支持,在大多数语言中实现,并且您可以免费获得手册页!