【问题标题】:How can certain warnings be ignored while others turned to exceptions from Python command line?如何忽略某些警告,而另一些则从 Python 命令行转向异常?
【发布时间】:2016-03-21 19:42:56
【问题描述】:

如何从命令行执行 Python 并忽略某些警告(例如DeprecationWarning),同时将其余部分变成异常?

-W 选项可以多次使用吗?

我面临的具体问题是我在tox/virtualenv 内部运行pytest/pytest-cov,并且因为virtualenv uses an outdated site.py module,当我之前使用-Werror 运行时会抛出DeprecationWarning我可以访问我的代码来捕获它。我想通过至少忽略这个警告来最小化对我的测试的影响,并将其他警告(ImportWarning 等)变成异常,以便我可以在我自己的代码中检测和处理这些警告。

【问题讨论】:

    标签: python exception warnings command-line-arguments


    【解决方案1】:

    手册页确实有这方面的信息,但有点难以阅读。在发布问题之前我找不到这个问题,所以我会看看我是否可以更容易找到:

    陷阱:-W 选项被后面的选项掩盖,-Werror 需要出现在之前 -Wignore


    按异常过滤:

    python -werror -Wignore::PendingDeprecationWarning your_stuff.py
    

    按行过滤:

    python -Werror -Wignore::::32 your_stuff.py
    

    忽略第 32 行的警告


    按模块/文件过滤:

    python -Werror -Wignore:::site: your_stuff.py
    

    忽略来自示例中site.py 模块的任何警告(异常回溯中的最后一个文件)


    选项是action:message:category:module:line


    手册页:

       -W argument
              Warning control.  Python sometimes prints warning message to sys.stderr.  A typical warning  message
              has  the following form: file:line: category: message.  By default, each warning is printed once for
              each source line where it occurs.  This option controls how often warnings are printed.  Multiple -W
              options  may be given; when a warning matches more than one option, the action for the last matching
              option is performed.  Invalid -W options are ignored (a warning message  is  printed  about  invalid
              options  when  the  first  warning is issued).  Warnings can also be controlled from within a Python
              program using the warnings module.
    
              The simplest form of argument is one of the following action strings  (or  a  unique  abbreviation):
              ignore  to  ignore  all  warnings; default to explicitly request the default behavior (printing each
              warning once per source line); all to print a warning each time it occurs (this  may  generate  many
              messages if a warning is triggered repeatedly for the same source line, such as inside a loop); modâ€
              ule to print each warning only the first time it occurs in each module; once to print  each  warning
              only  the  first time it occurs in the program; or error to raise an exception instead of printing a
              warning message.
    
              The full form of argument is action:message:category:module:line.   Here,  action  is  as  explained
              above  but only applies to messages that match the remaining fields.  Empty fields match all values;
              trailing empty fields may be omitted.  The message field matches the start of  the  warning  message
              printed;  this  match  is  case-insensitive.  The category field matches the warning category.  This
              must be a class name; the match test whether the actual warning category of the message  is  a  subâ€
              class  of  the  specified  warning  category.   The full class name must be given.  The module field
              matches the (fully-qualified) module name; this match is case-sensitive.  The line field matches the
              line number, where zero matches all line numbers and is thus equivalent to an omitted line number.
    

    【讨论】:

      【解决方案2】:
      python -Werror -Wignore::DeprecationWarning your_stuff.py
      

      https://docs.python.org/2/using/cmdline.html#cmdoption-W

      【讨论】:

      • 完美,双重:: 是我所缺少的,没有正确阅读文档。
      猜你喜欢
      • 2014-12-15
      • 1970-01-01
      • 2011-05-24
      • 2021-11-01
      • 2014-09-07
      • 2012-12-22
      • 2010-10-30
      • 1970-01-01
      • 2017-02-22
      相关资源
      最近更新 更多