【问题标题】:how to let the parser print help message rather than error and exit如何让解析器打印帮助消息而不是错误并退出
【发布时间】:2011-06-01 11:41:06
【问题描述】:

我正在使用argparse来处理cmd args,我想如果没有指定args,则打印帮助消息,但是现在解析会输出错误,然后退出。 我的代码是:

def main():
    print "in abing/start/main"
    parser = argparse.ArgumentParser(prog="abing")#, usage="%(prog)s <command> [args] [--help]")
    parser.add_argument("-v", "--verbose", action="store_true", default=False, help="show verbose output")

    subparsers = parser.add_subparsers(title="commands")

    bkr_subparser = subparsers.add_parser("beaker", help="beaker inspection")
    bkr_subparser.set_defaults(command=beaker_command)
    bkr_subparser.add_argument("-m", "--max", action="store", default=3, type=int, help="max resubmit count")
    bkr_subparser.add_argument("-g", "--grain", action="store", default="J", choices=["J", "RS", "R", "T", "job", "recipeset", "recipe", "task"], type=str, help="resubmit selection granularity")
    bkr_subparser.add_argument("job_ids", nargs=1, action="store", help="list of job id to be monitored")

    et_subparser = subparsers.add_parser("errata", help="errata inspection")
    et_subparser.set_defaults(command=errata_command)
    et_subparser.add_argument("-w", "--workflows", action="store_true", help="generate workflows for the erratum")
    et_subparser.add_argument("-r", "--run", action="store_true", help="generate workflows, and run for the erratum")
    et_subparser.add_argument("-s", "--start-monitor", action="store_true", help="start monitor the errata system")
    et_subparser.add_argument("-d", "--daemon", action="store_true", help="run monitor into daemon mode")
    et_subparser.add_argument("erratum", action="store", nargs=1, metavar="ERRATUM", help="erratum id")

    if len(sys.argv) == 1:
        parser.print_help()
        return

    args = parser.parse_args()
    args.command(args)

    return

我该怎么做? 谢谢。

【问题讨论】:

  • 现在解析会输出一个错误,然后退出 - 你得到什么错误?
  • 错误:参数太少

标签: python argparse


【解决方案1】:

解决方案在于继承argparse.ArgumentParser 并重新定义其error() 方法。事实上,一旦出错,ArgumentParser 就会调用它的error() 方法。然后可以通过子类而不是argparse.ArgumentParser 执行自定义参数解析。在argparse的源代码中找到了一个模型error()函数:

def error(self, message):
    """error(message: string)

    Prints a usage message incorporating the message to stderr and
    exits.

    If you override this in a subclass, it should not return -- it
    should either exit or raise an exception.
    """
    self.print_usage(sys.stderr)
    self.exit(2, '%s: error: %s\n' % (self.prog, message))

例如,可以在error() 中引发异常,而不是打印消息,以便调用parse_args() 的代码负责处理用户参数问题。

原答案:根据cmets中的说明,以下是行不通的。但是,它提供了一种从子命令功能访问帮助消息的机制:

您几乎拥有它:在您的每个*_command(args) 函数中,您可以测试args 的大小并在没有足够参数时打印错误消息。

如果您想使用自动生成的帮助,在您的命令函数中,您可以通过将子解析器传递给每个命令来获取它,如下所示:

args.command(subparsers, args)  # Instead of args.command(args)

每个*_command() 函数应该只接受两个参数而不是一个。可通过以下方式访问自动生成的帮助:

subparsers.choices['beaker'].print_help()  # or print_usage()

例如。

您也可以选择将特定的子解析器直接传递给每个子命令例程*_command()

args.command(subparsers.choices[sys.argv[1]], args)

然后,在每个*_command(subparser, args) 中,使用subparser.print_help() 打印帮助。

【讨论】:

  • 问题是调用parser.parse_args()会报错退出,所以如果不提供args就没有机会调用args.command(subparsers, args)。
猜你喜欢
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多