我在学校里创建了一个作为一项任务的程序,除了一件事,我完成了它。 我们必须使用不同的代码退出程序,具体取决于执行的执行方式。在我的程序中,我使用" argparse"处理选项。当我使用像"版本"这样的内置函数时我设法覆盖退出代码,但如果我写了一个不存在的选项,那么它就不会工作。它给了我"无法识别的错误" -message,并退出代码" 0",我需要它以代码1退出。无论如何要做到这一点?让我疯了,已经挣扎了几天......
提前致谢! / feeloor
答案 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的问题,并通过简单的测试和比较确定了什么错误。 感谢所有帮助人员!