【问题标题】:Use Python Argparse with several subparsers将 Python Argparse 与多个子解析器一起使用
【发布时间】:2016-08-18 08:01:21
【问题描述】:

您好,我正在尝试使用几个只接受特定长参数的子解析器来配置 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)

但我在以下几点上失败了。

  • 子解析器应该接受短格式和长格式。前任。 prog -c aprog -c apple 合法且相同
  • 除了--pamount 之外,不需要子解析器的参数。但是代码似乎在期待它们,因为我在运行有效模式python prog -c a时遇到以下错误@

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

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

【问题讨论】:

    标签: python arguments argparse


    【解决方案1】:

    通过使用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' 作为子解析器名称,请使用 aliases 参数(请参阅文档了解 add_parser)。

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

    【讨论】:

    • 感谢您的回答,这对找出方法非常有帮助。但是错误仍然存​​在,因为刚才我检查了aliases 是 Python 2.7 中的新内容,我正在使用 Python 2.6,并且必须在该版本中使用它。此外,当我添加 dest='choice' 时,我无法在参数中添加短格式 c
    • 你应该能够从任何 2.7 python 中窃取argparse.py 文件并放入你自己的目录中。
    • 是的,我会做类似的事情,因为当前的 argparse 模块版本是 1.2.1,我会将它升级到 1.4.1。这应该可以解决问题。 :)
    猜你喜欢
    • 2018-12-31
    • 2015-07-08
    • 2019-09-23
    • 2015-07-17
    • 2011-11-21
    • 2015-03-11
    • 2013-12-21
    • 2013-10-07
    • 1970-01-01
    相关资源
    最近更新 更多