How to parse multiple nested sub-commands using python argparse?

后端 未结 11 1103
执念已碎
执念已碎 2020-11-28 20:52

I am implementing a command line program which has interface like this:

cmd [GLOBAL_OPTIONS] {command [COMMAND_OPTS]} [{command [COMMAND_OPTS]} ...]
<         


        
11条回答
  •  春和景丽
    2020-11-28 21:39

    parse_known_args returns a Namespace and a list of unknown strings. This is similar to the extra in the checked answer.

    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
    

    produces:

    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') []
    

    An alternative loop would give each subparser its own namespace. This allows overlap in positionals names.

    argslist = []
    while rest:
        args,rest =  parser.parse_known_args(rest)
        argslist.append(args)
    

提交回复
热议问题