用法:
ArgumentParser.add_subparsers([title][, description][, prog][, parser_class][, action][, option_string][, dest][, required][, help][, metavar])
许多程序将其函数拆分为多个sub-commands,例如,
svn
程序可以像svn checkout
、svn update
和svn 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
命令时,只存在foo
和bar
属性,而当指定b
命令时,只存在foo
和baz
属性.类似地,当从子解析器请求帮助消息时,只会打印该特定解析器的帮助。帮助消息将不包括父解析器或兄弟解析器消息。 (但是,可以通过向
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()
方法还支持title
和description
关键字参数。当其中任何一个存在时,子解析器的命令将出现在帮助输出中它们自己的组中。例如:>>> 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 argparse.ArgumentParser.add_argument_group用法及代码示例
- Python argparse.ArgumentParser.add_mutually_exclusive_group用法及代码示例
- Python argparse.ArgumentParser.convert_arg_line_to_args用法及代码示例
- Python argparse.ArgumentParser.get_default用法及代码示例
- Python argparse.ArgumentParser.exit用法及代码示例
- Python argparse.ArgumentParser.set_defaults用法及代码示例
- Python argparse.FileType用法及代码示例
- Python ast.MatchClass用法及代码示例
- Python abc.ABCMeta用法及代码示例
- Python ast.ListComp用法及代码示例
- Python ast.Lambda用法及代码示例
- Python asyncio.BaseTransport.get_extra_info用法及代码示例
- Python ast.IfExp用法及代码示例
- Python unittest assertNotIsInstance()用法及代码示例
- Python ast.Return用法及代码示例
- Python Tkinter askopenfile()用法及代码示例
- Python ast.Subscript用法及代码示例
- Python asyncio.shield用法及代码示例
- Python asyncio.run用法及代码示例
- Python unittest assertIsNotNone()用法及代码示例
注:本文由纯净天空筛选整理自python.org大神的英文原创作品 argparse.ArgumentParser.add_subparsers。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。