首页 > 解决方案 > Python 3.9.1 argparse exit_on_error 在某些情况下不起作用

问题描述

我正在编写一个包含元命令的 REPL。元命令可以接受选项和参数,我正在尝试使用 argparse 来处理它们。因此,如果用户没有正确使用该命令,我不想完全退出程序。最多,我想打印一条使用消息并继续 REPL。这是我正在尝试的基本想法:

import argparse

p = argparse.ArgumentParser(exit_on_error=False)

p.add_argument('foo')

try:
    p.parse_args([])   # I want to catch the case of a user not supplying a required positional arg
except argparse.ArgumentError:
    print("error detected")

然而,运行上面的代码片段给了我这个(并在之后退出):

usage: test.py [-h] foo
test.py: error: the following arguments are required: foo

Python 3.9 文档是这样说的:

通常,当您将无效的参数列表传递给 an 的parse_args()方法时ArgumentParser,它将退出并显示错误信息。

如果用户想手动捕获错误,可以通过设置exit_on_error来启用该功能False

可能是我误解了“无效参数列表”的含义(以及文档中给出的示例某些作品),但我认为空参数列表将适用于这种情况。

我意识到还有其他方法可以处理这个问题(我已经成功测试了其中的一两个),但我只是想确保我没有遗漏exit_on_error参数。也就是说,有没有人知道为什么这不起作用?

标签: pythonargparse

解决方案


该参数仅处理一类错误,即处理特定参数时引发的错误。所需参数的测试以不同方式处理,并且不会被此参数转移。我怀疑这是在 Python 错误/问题上提出的,但我并没有对此给予太多关注。更改 parser.error 或 parser.exit 方法适用于两类错误。


推荐阅读