【问题标题】:With argparse are subparsers inherently mutually exclusive?使用 argparse 子解析器本质上是互斥的吗?
【发布时间】:2015-02-13 03:55:25
【问题描述】:

我有一个具有两个主要功能的脚本,升级和配置。我使用子解析器来指示脚本正在执行的操作,但我想避免将它们一起使用。

这是一个sn-p的代码:

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() ,但这是专门针对参数的。使用子解析器有什么方法可以避免它们一起使用吗?

【问题讨论】:

    标签: python python-2.7 argparse


    【解决方案1】:

    是的,它们是互斥的,尽管机制与 MXGroup 不同。

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

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

    subparser.add_parser(...)
    

    创建一个parser,并将其“名称”(和别名)添加到subparserchoices

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

    有一些关于如何解决这个问题的问题——他们想要处理多个子解析器。这样做的方法很棘手,并且涉及递归地(或重复地)调用解析器,每次都使用一组较小的原始参数。

    【讨论】:

    • 感谢您的确认,这很有道理。
    • @hpaulj 你说要解决方法从单个命令调用多个子解析器。你能详细说明如何做到这一点吗?或者指出我之前的任何问题。
    【解决方案2】:

    据我所知,子解析器默认是互斥的:

    请注意,parse_args() 返回的对象将仅包含主解析器和命令行选择的子解析器(而不是任何其他子解析器)的属性。所以上例中,当指定a命令时,只存在foobar属性,而当指定b命令时,只存在foobaz属性.

    来自python documentation on subparsers

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 1970-01-01
      • 2021-12-20
      • 2011-06-09
      • 2020-07-29
      • 1970-01-01
      • 2020-06-19
      • 2018-12-31
      相关资源
      最近更新 更多