python argparse 使用[-h]时如何才能不退出程序

发布于 2022-09-06 23:31:46 字数 479 浏览 20 评论 0

argparse 在使用[-h]时显示帮助,然后就退出了,如何才能不退出交互界面,等待下一个输入?

while True:
    cmd = input('>>>')
    parser = argparse.ArgumentParser()
    parser.add_argument('-f', help='foo')
    parser.parse_args(cmd.split())

这样输入[-h]的时候:

>>>-h
usage: test.py [-h] [-f F]

optional arguments:
  -h, --help  show this help message and exit
  -f F        foo

程序就结束了,现在我只要'show this help message',而不需要'exit',请问要如何做?谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟燃烟灭 2022-09-13 23:31:46

根本原因在于, argparse.parse_args() 会在出错和 -h 时执行 sys.exit() . 这个可以通过捕获 SystemExit 异常来解决:

import argparse

while True:
    cmd = input('>>>')
    parser = argparse.ArgumentParser()
    parser.add_argument('-f', help='foo')

    try:
        parser.parse_args(cmd.split())
    except SystemExit:
        print("ignoring SystemExit")

另外1: 建议不要把初始化代码放在循环块中, 我觉得这样写会更好:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-f', help='foo')

while True:
    cmd = input('>>>')
    try:
        parser.parse_args(cmd.split())
    except SystemExit:
        print("ignoring SystemExit")

另外2: 提出 python 问题时, 不妨注明你用的是 python2 还是 python3. 你的代码中, 有些规则在两个版本间有区别.

参考 - argparse.parse_args() 源码片段:

    def parse_args(self, args=None, namespace=None):
        args, argv = self.parse_known_args(args, namespace)
        if argv:
            msg = _('unrecognized arguments: %s')
            self.error(msg % ' '.join(argv))
        return args
class _HelpAction(Action):

    def __init__(self,
                 option_strings,
                 dest=SUPPRESS,
                 default=SUPPRESS,
                 help=None):
        super(_HelpAction, self).__init__(
            option_strings=option_strings,
            dest=dest,
            default=default,
            nargs=0,
            help=help)

    def __call__(self, parser, namespace, values, option_string=None):
        parser.print_help()
        parser.exit()
    def exit(self, status=0, message=None):
        if message:
            self._print_message(message, _sys.stderr)
        _sys.exit(status)

    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)
        args = {'prog': self.prog, 'message': message}
        self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文