不同子分析符中的常见位置参数

时间:2016-01-08 16:33:50

标签: python argparse python-2.x

我正在尝试使用 argparse 创建一个解析器,而不是解析以下命令:

python prog.py update <DOMAIN> <ENVIRONMENT>
python prog.py pull <DOMAIN> <ENVIRONMENT>
python prog.py release <DOMAIN> <ENVIRONMENT>

如您所见,更新发布采用相同的参数<DOMAIN><ENVIRONMENT>

这三个都是主解析器的子解析器。

我写了以下内容:

import argparse
# create the top-level parser
parser = argparse.ArgumentParser(prog='PROG', add_help=False)
parser.add_argument('domain', type=str, help='domain help')
parser.add_argument('environment', type=str, help='environment help')

#subparsers
subparsers = parser.add_subparsers(help='sub-command help', parents=[parser])
parser_pull = subparsers.add_parser('pull', help='pull help')
parser_update = subparsers.add_parser('update', help='update help')
print parser_pull.parse_args(['pull', 'WEBAPPS', 'DEV'])
print parser.parse_args(['update', 'WEBAPPS', 'DEV'])

但在子命令更新之前,似乎需要环境发布,因此会抛出错误。

如何在子命令之后接受这些参数,而不在每个子命令中复制代码?

为了记录,我使用Python 2.7。

1 个答案:

答案 0 :(得分:2)

继续并复制代码。有点剪切和粘贴并没有那么多工作。

必须按特定顺序给出位置参数。并且.add_subparsers会创建其中一个位置(一个期望值为&#39; pull&#39;,&#39;更新&#39;。因此,subparse命令的顺序,为主解析器定义的位置,和子分子的定位很重要。

parents机制,可以节省一些打字。但我犹豫推荐它,因为它可能会导致问题(之前的SO问题证明了这一点)。只需咬住子弹并输入预期的位置参数是最可靠的方法。

不要忘记你可以在一个循环或辅助函数中创建子分析器 - 为另一个函数保存一种类型。

例如,在创建子分析符之后:

for p in parser_pull, parser_update:
    p.add_argument('domain', type=str, help='domain help')
    p.add_argument('environment', type=str, help='environment help')