使用Python Argparse和几个subparser

时间:2016-04-25 04:16:31

标签: python arguments argparse

您好我正在尝试使用几个仅接受特定长参数的子分析器来配置argparse。以下是代码

import argparse

parser = argparse.ArgumentParser(prog='program', description='Prog Description')
subparsers = parser.add_subparsers(help='choices')
parser.add_argument('--choice', '-c', choices=['a', 'apple', 'b', 'banana', 'l', 'lemmon', 'p', 'papaya'], type=str, help='Menu Choices', required=True)
a_parser = subparsers.add_parser("a")
b_parser = subparsers.add_parser("b")
l_parser = subparsers.add_parser("l")
p_parser = subparsers.add_parser("p")

a_parser.add_argument("--peel")
b_parser.add_argument("--peel")
l_parser.add_argument("--lamount")
p_parser.add_argument("--pamount",required=True,type=str)

但我没有遵循以下几点。

  • subparsers应该接受短格式和长格式。恩。 prog -c aprog -c apple合法且相同
  • 除了--pamount之外,
  • 不需要子分析符。但是代码似乎在期待它们,因为我在运行有效模式python prog -c a

    时遇到了错误

    用法:程序[-h] - 选择{a,apple,b,banana,l,lemmon,p,papaya}                {a,p,b,l} ...... 程序:错误:参数太少

如果有人能为我提供解决这些问题的指导,我很高兴。谢谢!

1 个答案:

答案 0 :(得分:0)

使用subparsers,您不需要--choice可选。

subparsers = parser.add_subparsers(dest='choice', help='choices')
# parser.add_argument('--choice', '-c', choices=['a', 'apple', 'b', 'b ...

指定dest以在args中为子分析者名称定义一个位置(请参阅文档)。

当您使用'python prog -c a'时,它会将a解析为-c;但它仍然期望像a这样的字符串作为subparsers的参数(实际上是位置参数)。因此错误。 (换句话说,它不期望--peel参数;它在解析中没有那么远。)

python prog a
python prog a --peel 3

应该有用。

python prog p --pamount 1

也应该有效(需要--pamount)。

要接受'a'和'apple'作为subparser名称,请使用aliases参数(请参阅add_parser的文档)。

a_parser = subparsers.add_parser("a", aliases=['apple','apples','manzana'])