【问题标题】:Common positional arguments in different subparsers不同子解析器中的常见位置参数
【发布时间】:2016-04-13 09:59:27
【问题描述】:

我正在尝试使用 argparse 制作解析器,而不是可以解析以下命令:

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

如您所见,updatepullrelease 都采用相同的参数 &lt;DOMAIN&gt;&lt;ENVIRONMENT&gt;

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

我写了以下内容:

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'])

但似乎 domainenvironment 应该在子命令 update、pull 之前释放,所以它会抛出一个错误。

我怎样才能让它在子命令之后接受这些参数,而不在每个子命令中复制代码?

为了记录,我使用 Python 2.7。

【问题讨论】:

  • 我不认为你可以在 argparse 中做到这一点。您是否尝试过其他模块,例如clickoptparse(警告,已弃用)或docopt?我知道还有其他的,我不知道你想要的是否可以在其中任何一个中实现,但如果你对第 3 方库开放,我相信你可以找到一个这样做的。 (我个人喜欢使用 click,但就像我说的,我不知道它是否能满足您的需求)

标签: python argparse python-2.x


【解决方案1】:

继续复制代码。一点点剪切和粘贴并不是什么工作。

位置参数必须按特定顺序给出。并且.add_subparsers 创建了其中一个位置(需要像“拉”、“更新”这样的值。因此,子解析命令的顺序、为主解析器定义的位置以及子解析器的位置很重要。

有一个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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2022-10-08
    • 2021-08-02
    • 2018-10-21
    • 2015-06-19
    相关资源
    最近更新 更多