argparse是subparsers固有的互斥?

时间:2015-02-12 12:49:02

标签: python python-2.7 argparse

我有一个包含两个主要功能的脚本,升级和配置。我使用subparsers来指示脚本执行的操作,但我想避免它们一起使用。

这是代码的片段:

import argparse

def main():
    parser = argparse.ArgumentParser()
    subparser = parser.add_subparsers(help='sub-command help')
    parser.add_argument('--user', '-u', help='User', default=None, required=True)
    parser.add_argument('--password', '-p', help='Password', default=None, required=True)
    parser.add_argument('--server', '-s', help='server with Admin functionality', default=None, required=True)
    subparser_prov = subparser.add_parser('provision', help='Provision new managers')
    subparser_prov.set_defaults(which='provision')
    subparser_upgr = subparser.add_parser('upgrade', help='Upgrade worker by replacing them')
    subparser_upgr.set_defaults(which='upgrade')
    subparser_upgr.add_argument('--version', help='Deployment version', default=None)
    args = vars(parser.parse_args())

    print args['user']
    print args['password']

    if args['which'] == 'provision':
        print 'Provisioning new environment!'
    elif args['which'] == 'upgrade':
        print 'Upgrading workers! %s' % args['version']

if __name__ == "__main__":
    main()

我知道解析器和子解析器都支持add_mutually_exclusive_group(),但这是专门用于参数的。有一个subparser有没有任何方法可以避免它们一起使用?

2 个答案:

答案 0 :(得分:2)

是的,它们是互斥的,但机制与MXGroups不同。

subparser = parser.add_subparsers(help='sub-command help')

是一个add_argument命令,它创建一个positional参数,带有一个特殊的action类。除此之外,它还有choices值。

subparser.add_parser(...)

创建parser,并将其“名称”(和别名)添加到subparser的{​​{1}}。

位置参数只解析一次,因此只能处理一个子解析器。 subparser通常会处理所有剩余的参数。

有一些问题要求解决这个问题 - 那就是他们想要处理多个子分析符。这样做的方法很棘手,并且涉及递归(或重复)调用解析器,每次使用较小的原始参数集。

答案 1 :(得分:0)

据我所知,subparsers默认是互斥的:

  

请注意,parse_args()返回的对象只包含主解析器和命令行选择的子解析器(而不是任何其他子分析器)的属性。因此,在上面的示例中,当指定a命令时,仅存在foobar属性,并且在指定b命令时,仅foo命令存在1}}和baz属性。

来自python documentation on subparsers