Python argparse - 向多个子解析器添加参数 [英] Python argparse - Add argument to multiple subparsers
问题描述
我的脚本定义了一个主解析器和多个子解析器.我想将 -p
参数应用于一些子解析器.到目前为止,代码如下所示:
My script defines one main parser and multiple subparsers. I want to apply the -p
argument to some subparsers. So far the code looks like this:
parser = argparse.ArgumentParser(prog="myProg")
subparsers = parser.add_subparsers(title="actions")
parser.add_argument("-v", "--verbose",
action="store_true",
dest="VERBOSE",
help="run in verbose mode")
parser_create = subparsers.add_parser ("create",
help = "create the orbix environment")
parser_create.add_argument ("-p",
type = int,
required = True,
help = "set db parameter")
# Update
parser_update = subparsers.add_parser ("update",
help = "update the orbix environment")
parser_update.add_argument ("-p",
type = int,
required = True,
help = "set db parameter")
如您所见,add_arument ("-p")
重复了两次.我实际上有更多的子解析器.有没有办法循环遍历现有的子解析器以避免重复?
As you can see the add_arument ("-p")
is repeated twice. I actually have a lot more subparsers. Is there a way to loop through the existing subparsers in order to avoid repetition?
为了记录,我使用的是 Python 2.7
For the record, I am using Python 2.7
推荐答案
这可以通过定义一个 父解析器 包含公共选项:
This can be achieved by defining a parent parser containing the common option(s):
import argparse
parent_parser = argparse.ArgumentParser(description="The parent parser")
parent_parser.add_argument("-p", type=int, required=True,
help="set db parameter")
subparsers = parent_parser.add_subparsers(title="actions")
parser_create = subparsers.add_parser("create", parents=[parent_parser],
add_help=False,
description="The create parser",
help="create the orbix environment")
parser_create.add_argument("--name", help="name of the environment")
parser_update = subparsers.add_parser("update", parents=[parent_parser],
add_help=False,
description="The update parser",
help="update the orbix environment")
这会生成以下格式的帮助消息:
This produces help messages of the format:
parent_parser.print_help()
输出:
usage: main.py [-h] -p P {create,update} ...
The parent parser
optional arguments:
-h, --help show this help message and exit
-p P set db parameter
actions:
{create,update}
create create the orbix environment
update update the orbix environment
parser_create.print_help()
输出:
usage: main.py create [-h] -p P [--name NAME] {create,update} ...
The create parser
optional arguments:
-h, --help show this help message and exit
-p P set db parameter
--name NAME name of the environment
actions:
{create,update}
create create the orbix environment
update update the orbix environment
然而,如果你运行你的程序,如果你没有指定一个动作(即 create
或 update
),你就不会遇到错误.如果您需要这种行为,请按如下方式修改您的代码.
However, if you run your program, you will not encounter an error if you do not specify an action (i.e. create
or update
). If you desire this behavior, modify your code as follows.
<...>
subparsers = parent_parser.add_subparsers(title="actions")
subparsers.required = True
subparsers.dest = 'command'
<...>
此修复是在 this SO question 中提出的,它指的是跟踪拉动的问题请求.
This fix was brought up in this SO question which refers to an issue tracking a pull request.
由于自 2011 年以来处理子解析器的变化,将主解析器用作 parent
是一个坏主意.更一般地说,不要尝试在主解析器和子解析器中定义相同的参数(相同的 dest
).子解析器的值将覆盖主要设置的任何内容(即使子解析器 default
也会这样做).创建单独的解析器以用作 parents
.如文档中所示,家长应使用 add_help=False
.
Due to changes in handling subparsers since 2011, it is a bad idea to use the main parser as a parent
. More generally, don't try to define the same argument (same dest
) in both main and sub parsers. The subparser values will overwrite anything set by the main (even the subparser default
does this). Create separate parser(s) to use as parents
. And as shown in the documentation, parents should use add_help=False
.
这篇关于Python argparse - 向多个子解析器添加参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!