Python argparse - 为多个子分析器添加参数

时间:2011-09-21 10:59:46

标签: python argparse

我的脚本定义了一个主解析器和多个子解析器。我想将-p参数应用于某些subparser。到目前为止代码看起来像这样:

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")重复两次。我实际上有更多的subsparsers。有没有办法循环现有的子分析符以避免重复?

为了记录,我使用的是Python 2.7

3 个答案:

答案 0 :(得分:69)

这可以通过定义包含公共选项的parent parser来实现:

[...]
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument("-p", type=int, required=True,
                           help="set db parameter")
parser_create = subparsers.add_parser("create", parents=[parent_parser],
                                      help="create the orbix environment")
parser_update = subparsers.add_parser("update", parents=[parent_parser],
                                      help="update the orbix environment")

答案 1 :(得分:2)

您可以按照以下方式遍历您的子分析器。

for name, subp in subparsers.choices.items():
    print(subp)
    subp.add_argument(dest='g', help='Inpput for g variable', default='7')

答案 2 :(得分:1)

可接受的答案是正确的,正确的方法是使用parent parsers,但是IMO的示例代码并没有真正解决问题,让我加分以提供一个更合适的示例。

可接受的答案的主要区别是显式可能具有一些根级参数(--verbose)以及仅用于 some 子解析器(-p的共享参数createupdate子解析器,但不适用于其他子解析器)

# Same main parser as usual
parser = argparse.ArgumentParser()

# Usual arguments which are applicable for the whole script / top-level args
parser.add_argument('--verbose', help='Common top-level parameter', action='store_true', required=False)

# Same subparsers as usual
subparsers = parser.add_subparsers(help='Desired action to perform', dest='action')

# Usual subparsers not using common options
parser_other = subparsers.add_parser("extra-action", help='Do something without db')

# Create parent subparser. Note `add_help=False` and creation via `argparse.`
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('-p', help='add db parameter', required=True)

# Subparsers based on parent

parser_create = subparsers.add_parser("create", parents=[parent_parser], help='Create something')
# Add some arguments exclusively for parser_create

parser_update = subparsers.add_parser("update", parents=[parent_parser], help='Update something')
# Add some arguments exclusively for parser_update 

顶级帮助消息(请注意,此处-p参数未显示,正是您所期望的-因为它特定于某些子解析器)

>>> parser.print_help()
usage: [-h] [--verbose] {extra-action,create,update} ...

positional arguments:
  {extra-action,create,update}
                        Desired action to perform
    extra-action        Do something without db
    create              Create something
    update              Update something

optional arguments:
  -h, --help            show this help message and exit
  --verbose             Common top-level parameter

create操作的帮助:

>>> parser_create.print_help()
usage:  create [-h] -p P

optional arguments:
  -h, --help  show this help message and exit
  -p P        add db parameter