我正在尝试使用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'])
但似乎 domain 和 environment 需要在子命令 <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/