47

我认为这是不可能的,但我想自己处理来自 argparse 的异常。

例如:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help', required=True)
try:
    args = parser.parse_args()
except:
    do_something()

当我运行它时:

$ myapp.py
usage: myapp --foo foo
myapp: error: argument --foo is required

但我希望它改为例外。

4

2 回答 2

78

当发生错误时,您可以子类ArgumentParser化并覆盖该方法以执行不同的操作:error

class ArgumentParserError(Exception): pass

class ThrowingArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        raise ArgumentParserError(message)

parser = ThrowingArgumentParser()
parser.add_argument(...)
...
于 2013-02-06T11:54:51.593 回答
26

就我而言, argparse 打印“参数太少”然后退出。阅读 argparse 代码后,我发现它只是在打印一些消息后调用 sys.exit() 。由于 sys.exit() 只会抛出 SystemExit 异常,因此您只需捕获此异常即可。

所以试试这个,看看它是否适合你。

    try:
        args = parser.parse_args(args)
    except SystemExit:
        .... your handler here ...
        return
于 2015-03-19T06:21:05.647 回答