如何让解析器打印帮助信息而不是错误并退出
我正在使用argparse这个工具来处理命令行参数。我想要的是,如果没有指定任何参数,就打印出帮助信息,但现在程序会输出一个错误信息,然后直接退出。
我的代码是:
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
我该怎么做呢?谢谢。
1 个回答
3
这个解决方案是通过创建一个新的类来继承 argparse.ArgumentParser
,并重新定义它的 error()
方法。实际上,当出现错误时,ArgumentParser
会调用它的 error()
方法。这样,你就可以通过这个新类来处理参数,而不是直接用 argparse.ArgumentParser
。
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()
的代码就可以处理用户参数的问题。
原始回答:根据评论中的说明,下面的方法并不奏效。不过,它提供了一种从子命令函数中访问帮助信息的机制:
你几乎做对了:在每个 *_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()
打印帮助信息。