【问题标题】:Suppressing argparse Error message - Python抑制 argparse 错误消息 - Python
【发布时间】:2016-06-20 05:54:55
【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: python command-line arguments


    【解决方案1】:

    您可以使用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 方法。

    【讨论】:

      【解决方案2】:

      ArgumentParser.parse_known_args(args=None, namespace=None) 可能会有所帮助。它解析命令行并返回一个元组(命名空间,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
      

      【讨论】:

        【解决方案3】:

        从 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')
        

        【讨论】:

          【解决方案4】:
          #!/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!')
          

          【讨论】:

          • 问题是如何抑制 argparse 强加给用户的错误消息,而不是如何重新格式化参数以便不抛出消息。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-07
          • 2021-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多