我希望Python argparse抛出一个异常,而不是用法
我认为这是不可能的,但我想自己处理argparse的异常 例如:我希望Python argparse抛出一个异常,而不是用法,python,argparse,Python,Argparse,我认为这是不可能的,但我想自己处理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
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
但是我想让它变成异常。您可以将
ArgumentParser
子类化,并重写error
方法,以便在发生错误时执行不同的操作:
class ArgumentParserError(Exception): pass
class ThrowingArgumentParser(argparse.ArgumentParser):
def error(self, message):
raise ArgumentParserError(message)
parser = ThrowingArgumentParser()
parser.add_argument(...)
...
在我的例子中,argparse打印“参数太少”,然后退出。在阅读argparse代码后,我发现它在打印一些消息后只调用sys.exit()。由于sys.exit()只会引发SystemExit异常,因此您可以捕获此异常 所以试试这个,看看它是否适合你
try:
args = parser.parse_args(args)
except SystemExit:
.... your handler here ...
return
那么,您没有使用argparse来实现它的设计目的。你想做什么?改变一个伟大的库的工作方式并不是一件坏事,只是将它调整到一个特定的项目。实际上你已经可以做到了。只需捕获
SystemExit
并用其他对象替换sys.stderr
。@jdborg:不一定是坏的,但通常是坏的。在这种情况下,我想听听你想要实现什么,很可能有更好的方法。根据你想做什么,修改论点本身可能更好。--foo
的参数是可选的吗?您可以定义一个自定义操作来处理它吗?这些操作可能比覆盖argparse
退出的决定更干净。我想应该是这样的。谢谢你明确的回答。我希望避免类似的事情,尽管我很高兴这是一个选择。你看,当我收到“错误:参数太少”通知时,我正试图打印帮助菜单;我的argparse安装程序需要至少一个参数才能成功运行,但我认为最好打印出这些命令,而用户不必使用“-h”参数运行脚本。类似于:parser.set\u error(“参数太少”,方法\u处理\u错误)
如果我想要这个功能,我想我总是可以提交一个bug。谢谢是的,巴库留的评论中提到了这个选项。unittestingtest\u argparse.py
文件使用这种方法,同时重新定义error
以创建一个ErrorRaisingArgumentParser
类。错误消息将在stderr上抛出。有没有办法捕获它?@Raj您可以临时将stderr重定向到另一个流/文件对象,例如: