我正在使用argparse来解析命令行参数。但是在这个时候,我有一个不寻常的请求:我想抑制错误消息。例如:
# !/usr/bin/env python
try:
parser = argparse.ArgumentParser(description='Parse')
parser.add_argument('url', metavar='URL', type=str, nargs='+',
help='Specify URL')
except:
print("Invalid arguments or number of arguments")
exit(2)
所以我只希望打印"Invalid arguments or number of arguments"
而不打印其他内容。但是,我执行代码例如:
./foo --BOGUS
我收到了完整的使用信息:
usage: foo [-h]
foo: error: too few arguments
foo: Invalid arguments or number of arguments
我怎样才能实现这一目标?
答案 0 :(得分:2)
您可以使用contextlib.redirect_stderr
来取消argparse
的输出:
import io
from contextlib import redirect_stderr
try:
f = io.StringIO()
with redirect_stderr(f):
parser.parse_args()
except:
print("Invalid arguments or number of arguments")
exit(2)
另一个选择是子类ArgumentParser
并覆盖exit
方法。
答案 1 :(得分:2)
ArgumentParser.parse_known_args(args=None, namespace=None)
可能有所帮助。它解析命令行并返回一个元组(namespace,unknown_args)。 namespace包含被识别的args,而unknown_args是一个无法识别的args列表。
ns, unknown_args = parser.parse_known_args()
if unknown_args != []:
# do something with erroneous args, e.g., silent exit
else:
# do something else
答案 2 :(得分:0)
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser()
url_command = parser.add_argument('url', metavar='URL', nargs='*', help='Specify URL(s)')
args = parser.parse_args()
url_command.nargs='+' # format the usage correctly
if not args.url:
parser.error('At least one URL is required!')
答案 3 :(得分:0)
从 Python 3.9 开始,使用 exit_on_error
参数:
parser = argparse.ArgumentParser(exit_on_error=False)
这允许您手动捕获错误:
try:
parser.parse_args('--integers a'.split())
except argparse.ArgumentError:
print('Catching an argumentError')