Python3覆盖argparse错误

时间:2015-10-08 09:07:14

标签: python python-3.x override argparse exit-code

我在学校里创建了一个作为一项任务的程序,除了一件事,我完成了它。 我们必须使用不同的代码退出程序,具体取决于执行的执行方式。在我的程序中,我使用" argparse"处理选项。当我使用像"版本"这样的内置函数时我设法覆盖退出代码,但如果我写了一个不存在的选项,那么它就不会工作。它给了我"无法识别的错误" -message,并退出代码" 0",我需要它以代码1退出。无论如何要做到这一点?让我疯了,已经挣扎了几天......

提前致谢! / feeloor

3 个答案:

答案 0 :(得分:0)

要实现这样的目标,请继承argparse.ArgumentParser并重新实现exit方法(如果愿意,可以重新实现error方法)。

例如:

class Parser(argparse.ArgumentParser):
    # the default status on the parent class is 0, we're 
    # changing it to be 1 here ...
    def exit(self, status=1, message=None):
        return super().exit(status, message)

答案 1 :(得分:0)

来自Python argparse文档

https://docs.python.org/3/library/argparse.html#exiting-methods

16.4.5.9. Exiting methods

ArgumentParser.exit(status=0, message=None)

    This method terminates the program, exiting with the specified status and, if given, it prints a message before that.

ArgumentParser.error(message)

    This method prints a usage message including the message to the standard error and terminates the program with a status code of 2.

他们都得到message,然后传递给它。 error添加usage并将其传递给exit。您可以在子类化的解析器中自定义它们。

还有一些错误捕获和重定向单元测试文件test/test_argparse.py的示例。

使用try/except包装器时遇到的问题是,error信息会写入sys.stderr,而不会合并到sys.exc_info

In [117]: try:
    parser.parse_args(['ug'])
except:
    print('execinfo:',sys.exc_info())
   .....:     
usage: ipython3 [-h] [--test TEST] [--bar TEST] test test
ipython3: error: the following arguments are required: test
execinfo: (<class 'SystemExit'>, SystemExit(2,), <traceback object at 0xb31fb34c>)

退出号码在exc_info中可用,但不在消息中。

一种选择是在sys.stderr阻止的同时重定向try/except

以下是更改exit方法并在try块中包装调用的示例:

In [155]: 
def altexit(status, msg):
    print(status, msg)
    raise ValueError(msg)
   .....: 
In [156]: parser.exit=altexit

In [157]: 
try:                     
    parser.parse_args(['--ug','ug','ug'])
except ValueError:       
    msg = sys.exc_info()[1]
   .....:     
usage: ipython3 [-h] [--test TEST] [--bar TEST] test test
2 ipython3: error: unrecognized arguments: --ug

In [158]: msg
Out[158]: ValueError('ipython3: error: unrecognized arguments: --ug\n')

Python让我替换现有对象的方法。我不建议在生产代码中使用它,但在尝试创意时很方便。我捕获错误(我选择的ValueError是任意的),并保存消息以供以后显示或测试。

通常,错误类型(例如TypeError,ValueError等)是公共API的一部分,但错误文本不是。它可以从一个Python版本升级到下一个版本而无需太多通知。因此,您需要自行承担测试邮件详细信息的费用。

答案 2 :(得分:0)

我解决了捕获SystemExit的问题,并通过简单的测试和比较确定了什么错误。 感谢所有帮助人员!