python - 不同子解析器中的常见位置参数

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

但似乎 domainenvironment 需要在子命令 <​​strong>update、pull 之前释放,所以它会抛出一个错误。

如何使其需要接受子命令之后的这些参数,而不在每个子命令内重复代码?

郑重声明,我使用 Python 2.7。

最佳答案

继续复制代码。一点点剪切和粘贴并不是那么麻烦。

位置参数必须按一定的顺序给出。并且 .add_subparsers 创建这些位置之一(需要“pull”、“update”等值的位置。因此,子解析命令的顺序、为主解析器定义的位置以及子解析器的位置很重要.

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

关于python - 不同子解析器中的常见位置参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34681796/

相关文章:

Python:Jupyter Notebook 中的 pretty-print

python - 如何使用字符串格式打印 '%' 标志?

python - 使用 TF 2.0 将 saving_model 转换为 TFLite 模型

python - Pandas 数据框 : is there any way to transform columns as row values in pandas

python - 遍历 MultiDict 中的键和所有值

python - Dask: Groupby 和 'First'/'Last' in agg

python-3.x - parse_args() 的功能是什么,我需要在哪里传递参数

python - Pip 不会从 pypi 安装最新的可用版本(在这种情况下为 argparse)

python - argparse:如何调用方法而不是函数?

python - 无法使用 subprocess.Popen 捕获 ls -la 的结果