2011-09-21 70 views
39

我的脚本定义了一个主分析器和多个子分析器。我想将-p的论点应用于一些子分析器。到目前为止,代码如下所示:Python argparse - 为多个子分析器添加参数

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

为了记录在案,我使用Python 2.7

+0

相关:http://stackoverflow.com/questions/14918804/how-to-show-help-for-all-subparsers-in-argparse –

回答

52

这可以通过定义parent parser具有共同的选项(S)来实现:

[...] 
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") 
+7

从[该文档](HTTPS://文档。 python.org/3/library/argparse.html#sub-commands):“当从子分析器请求帮助信息时,只会打印该分析器的帮助信息,帮助信息不包括父解析器或兄弟分析器消息“。这似乎是这一战略的一个主要缺点。 –

+0

我最终通过帮助消息向根分析器添加了一个伪参数。 –

7

你也可以遍历所有的subparsers并添加同样的选择所有的人。

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_update = subparsers.add_parser ("update", 
             help = "update the orbix environment") 

for subparser in [parser_create, parser_update]: 
    subparser.add_argument ("-p", 
          type = int, 
          required = True, 
          help = "set db parameter") 
+1

我认为这是一个不好的方法,因为你需要遍历参数。 Sven Marnach的答案更加干爽和可重写。 – NeoMorfeo

2

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

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