首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用python arg解析多个嵌套的子命令?

如何使用python arg解析多个嵌套的子命令?
EN

Stack Overflow用户
提问于 2018-07-27 03:32:02
回答 2查看 0关注 0票数 0

我正在实现一个具有如下接口的命令行程序:

代码语言:txt
复制
cmd [GLOBAL_OPTIONS] {command [COMMAND_OPTS]} [{command [COMMAND_OPTS]} ...]

从文档中看,我似乎只能有一个子命令。但正如你所看到的,我必须实现一个或多个子命令。使用以下方法解析此类命令行参数的最佳方法是什么?argparse?

EN

回答 2

Stack Overflow用户

发布于 2018-07-27 12:29:21

解决方案是,我们不能简单地将子解析器嵌套到另一个子解析器中,而是可以在另一个子解析器之后添加子解析器。

下面是代码:

代码语言:txt
复制
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()   
票数 0
EN

Stack Overflow用户

发布于 2018-07-27 12:50:56

parse_known_args返回一个名称空间和一个未知字符串列表。extra在核对的答案中。

代码语言:txt
复制
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

生产:

代码语言:txt
复制
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') []

另一个循环将为每个子解析器提供自己的命名空间,这允许位置名称重叠。

代码语言:txt
复制
argslist = []
while rest:
    args,rest =  parser.parse_known_args(rest)
    argslist.append(args)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100001386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档