抑制argparse错误消息 - Python

时间:2016-03-06 18:41:10

标签: python command-line arguments

我正在使用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 

我怎样才能实现这一目标?

4 个答案:

答案 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')