我正在实现一个具有如下接口的命令行程序:
cmd [GLOBAL_OPTIONS] {command [COMMAND_OPTS]} [{command [COMMAND_OPTS]} ...]
从文档中看,我似乎只能有一个子命令。但正如你所看到的,我必须实现一个或多个子命令。使用以下方法解析此类命令行参数的最佳方法是什么?argparse
?
发布于 2018-07-27 12:29:21
解决方案是,我们不能简单地将子解析器嵌套到另一个子解析器中,而是可以在另一个子解析器之后添加子解析器。
下面是代码:
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('--user', '-u',
default=getpass.getuser(),
help='username')
parent_parser.add_argument('--debug', default=False, required=False,
action='store_true', dest="debug", help='debug flag')
main_parser = argparse.ArgumentParser()
service_subparsers = main_parser.add_subparsers(title="service",
dest="service_command")
service_parser = service_subparsers.add_parser("first", help="first",
parents=[parent_parser])
action_subparser = service_parser.add_subparsers(title="action",
dest="action_command")
action_parser = action_subparser.add_parser("second", help="second",
parents=[parent_parser])
args = main_parser.parse_args()
发布于 2018-07-27 12:50:56
parse_known_args
返回一个名称空间和一个未知字符串列表。extra
在核对的答案中。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
sub = parser.add_subparsers()
for i in range(1,4):
sp = sub.add_parser('cmd%i'%i)
sp.add_argument('--foo%i'%i) # optionals have to be distinct
rest = '--foo 0 cmd2 --foo2 2 cmd3 --foo3 3 cmd1 --foo1 1'.split() # or sys.argv
args = argparse.Namespace()
while rest:
args,rest = parser.parse_known_args(rest,namespace=args)
print args, rest
生产:
Namespace(foo='0', foo2='2') ['cmd3', '--foo3', '3', 'cmd1', '--foo1', '1']
Namespace(foo='0', foo2='2', foo3='3') ['cmd1', '--foo1', '1']
Namespace(foo='0', foo1='1', foo2='2', foo3='3') []
另一个循环将为每个子解析器提供自己的命名空间,这允许位置名称重叠。
argslist = []
while rest:
args,rest = parser.parse_known_args(rest)
argslist.append(args)
https://stackoverflow.com/questions/-100001386
复制相似问题