当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python argparse.ArgumentParser.add_subparsers用法及代码示例


用法:

ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_string][, dest][, required][, help][, metavar])

许多程序将其函数拆分为多个sub-commands,例如,svn 程序可以像 svn checkoutsvn updatesvn commit 一样调用 sub-commands。当程序执行需要不同类型命令行 参数的多个不同函数时,以这种方式拆分函数可能是一个特别好的主意。 ArgumentParser 支持使用 add_subparsers() 方法创建此类 sub-commands。 add_subparsers() 方法通常不带参数调用,并返回一个特殊的操作对象。该对象有一个方法 add_parser() ,它接受一个命令名称和任何 ArgumentParser 构造函数参数,并返回一个可以照常修改的 ArgumentParser 对象。

参数说明:

  • title - 帮助输出中sub-parser 组的标题;默认情况下 “subcommands” 如果提供了说明,否则使用标题作为位置参数
  • description - 帮助输出中sub-parser 组的说明,默认为None
  • prog - 将与sub-command 帮助一起显示的使用信息,默认情况下是程序的名称和子解析器参数之前的任何位置参数
  • parser_class - 用于创建 sub-parser 实例的类,默认为当前解析器的类(例如 ArgumentParser)
  • action - 在命令行遇到此参数时要采取的基本操作类型
  • dest - 将存储 sub-command 名称的属性名称;默认情况下 None 并且不存储任何值
  • required - 默认情况下是否必须提供子命令 False(在 3.7 中添加)
  • help - 帮助输出中sub-parser 组的帮助,默认为None
  • metavar - 在帮助中显示可用的字符串 sub-commands;默认情况下它是 None 并以 {cmd1, cmd2, ..} 的形式呈现 sub-commands

一些示例用法:

>>> # create the top-level parser
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', action='store_true', help='foo help')
>>> subparsers = parser.add_subparsers(help='sub-command help')
>>>
>>> # create the parser for the "a" command
>>> parser_a = subparsers.add_parser('a', help='a help')
>>> parser_a.add_argument('bar', type=int, help='bar help')
>>>
>>> # create the parser for the "b" command
>>> parser_b = subparsers.add_parser('b', help='b help')
>>> parser_b.add_argument('--baz', choices='XYZ', help='baz help')
>>>
>>> # parse some argument lists
>>> parser.parse_args(['a', '12'])
Namespace(bar=12, foo=False)
>>> parser.parse_args(['--foo', 'b', '--baz', 'Z'])
Namespace(baz='Z', foo=True)

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

类似地,当从子解析器请求帮助消息时,只会打印该特定解析器的帮助。帮助消息将不包括父解析器或兄弟解析器消息。 (但是,可以通过向 add_parser() 提供 help= 参数来提供每个子解析器命令的帮助消息,如上所述。)

>>> parser.parse_args(['--help'])
usage: PROG [-h] [--foo] {a,b} ...

positional arguments:
  {a,b}   sub-command help
    a     a help
    b     b help

options:
  -h, --help  show this help message and exit
  --foo   foo help

>>> parser.parse_args(['a', '--help'])
usage: PROG a [-h] bar

positional arguments:
  bar     bar help

options:
  -h, --help  show this help message and exit

>>> parser.parse_args(['b', '--help'])
usage: PROG b [-h] [--baz {X,Y,Z}]

options:
  -h, --help     show this help message and exit
  --baz {X,Y,Z}  baz help

add_subparsers() 方法还支持 titledescription 关键字参数。当其中任何一个存在时,子解析器的命令将出现在帮助输出中它们自己的组中。例如:

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(title='subcommands',
...                                    description='valid subcommands',
...                                    help='additional help')
>>> subparsers.add_parser('foo')
>>> subparsers.add_parser('bar')
>>> parser.parse_args(['-h'])
usage:  [-h] {foo,bar} ...

options:
  -h, --help  show this help message and exit

subcommands:
  valid subcommands

  {foo,bar}   additional help

此外,add_parser 支持额外的 aliases 参数,它允许多个字符串引用同一个子解析器。此示例与 svn 类似,将 co 别名为 checkout 的简写:

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers()
>>> checkout = subparsers.add_parser('checkout', aliases=['co'])
>>> checkout.add_argument('foo')
>>> parser.parse_args(['co', 'bar'])
Namespace(foo='bar')

处理sub-commands 的一种特别有效的方法是将add_subparsers() 方法的使用与对set_defaults() 的调用结合起来,以便每个子解析器知道它应该执行哪个Python 函数。例如:

>>> # sub-command functions
>>> def foo(args):
...     print(args.x * args.y)
...
>>> def bar(args):
...     print('((%s))' % args.z)
...
>>> # create the top-level parser
>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers()
>>>
>>> # create the parser for the "foo" command
>>> parser_foo = subparsers.add_parser('foo')
>>> parser_foo.add_argument('-x', type=int, default=1)
>>> parser_foo.add_argument('y', type=float)
>>> parser_foo.set_defaults(func=foo)
>>>
>>> # create the parser for the "bar" command
>>> parser_bar = subparsers.add_parser('bar')
>>> parser_bar.add_argument('z')
>>> parser_bar.set_defaults(func=bar)
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('foo 1 -x 2'.split())
>>> args.func(args)
2.0
>>>
>>> # parse the args and call whatever function was selected
>>> args = parser.parse_args('bar XYZYX'.split())
>>> args.func(args)
((XYZYX))

这样,您可以让parse_args() 在参数解析完成后调用相应的函数。将函数与此类操作相关联通常是为每个子解析器处理不同操作的最简单方法。但是,如果需要检查被调用的子解析器的名称,add_subparsers() 调用的 dest 关键字参数将起作用:

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(dest='subparser_name')
>>> subparser1 = subparsers.add_parser('1')
>>> subparser1.add_argument('-x')
>>> subparser2 = subparsers.add_parser('2')
>>> subparser2.add_argument('y')
>>> parser.parse_args(['2', 'frobble'])
Namespace(subparser_name='2', y='frobble')

在 3.7 版中更改:新的required关键字参数。

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 argparse.ArgumentParser.add_subparsers。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。