如何从命令行执行Python并忽略某些警告(例如 DeprecationWarning
),同时将其余警告转为异常?
可以-W
多次使用选项来执行此操作?
我面临的具体问题是我正在运行 pytest
/pytest-cov
tox
里面/virtualenv
因为 virtualenv
uses an outdated site.py
module ,一个DeprecationWarning
当我用 -Werror
运行时抛出在我获得代码访问权限以捕获它之前。我想通过至少忽略此警告来最大程度地减少对测试的影响,并将其他警告( ImportWarning
等)转换为异常,以便我可以在自己的代码中检测和处理这些警告。
最佳答案
手册页确实有这方面的信息,但是有点难以阅读。在发布问题之前我找不到这个问题,所以我会看看是否可以使它更容易找到:
陷阱:-W
选项被后面的选项屏蔽,-Werror
需要出现在之前 -Wignore
按异常(exception)过滤:
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.
关于python - 如何忽略某些警告,而其他警告则从 Python 命令行转向异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36140169/