如何禁用python警告


419

我正在使用的代码会使用该warnings库抛出很多(目前对我来说)无用的警告。阅读(/扫描)文档后,我只找到了一种禁用单个功能警告的方法。但是我不想更改太多代码。

可能有像这样的标志python -no-warning foo.py吗?

你会推荐什么?


9
我通常都同意@MartinSamson,但是有合理的情况可以忽略警告。我通过在defusedxml:中使用有效的Xpath语法获得了其中一些FutureWarning: This search is broken in 1.3 and earlier, and will be fixed in a future version. If you rely on the current behaviour, change it to [this other thing]。我宁愿现在忽略警告并等待其被静默地修复,也不愿编写不必要的丑陋代码以免产生无害警告。
Pedro

Answers:



576

您是否查看了python文档的“ 抑制警告”部分?

如果您使用的代码知道会发出警告(例如已弃用的函数),但又不想看到该警告,则可以使用catch_warnings上下文管理器来抑制该警告:

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    fxn()

我不容忍,但是您可以通过以下方式取消所有警告

import warnings
warnings.filterwarnings("ignore")

例如:

>>> import warnings
>>> def f():
...  print('before')
...  warnings.warn('you are warned!')
...  print('after')
>>> f()
before
__main__:3: UserWarning: you are warned!
after
>>> warnings.filterwarnings("ignore")
>>> f()
before
after

12
@Framester-是的,IMO这是抑制特定警告的最干净的方法,一般会出现警告,因为可能出了一些问题,因此通过命令行禁止所有警告可能不是最好的选择。
Mike

1
@Framester-我还列出了一个示例,还列出了另一个选项...我不太喜欢它(由于我在前面的评论中给出的原因),但至少现在您有了这些工具。
Mike

41
如果只希望捕获特定类别的警告,则可以使用以下category参数将其传递:warnings.filterwarnings("ignore", category=DeprecationWarning)
ostrokach

1
在这种情况下,这对我很有用,因为html5lib即使不解析xml也会吐出lxml警告。谢谢
jamescampbell

5
该函数还有一个有用的参数warnings.filterwarningsmodule。它允许您忽略来自指定模块的警告。
用户名

103

您还可以定义环境变量(2010年的新功能-即python 2.7)

export PYTHONWARNINGS="ignore"

像这样测试:默认

$ export PYTHONWARNINGS="default"
$ python
>>> import warnings
>>> warnings.warn('my warning')
__main__:1: UserWarning: my warning
>>>

忽略警告

$ export PYTHONWARNINGS="ignore"
$ python
>>> import warnings
>>> warnings.warn('my warning')
>>> 

对于弃用警告,请查看如何忽略python中的弃用警告

在这里复制...

warnings模块的文档中:

 #!/usr/bin/env python -W ignore::DeprecationWarning

如果您使用的是Windows,请-W ignore::DeprecationWarning作为参数传递给Python。最好通过强制转换为int来解决问题。

(请注意,在Python 3.2中,默认情况下会忽略弃用警告。)

要么:

import warnings

with warnings.catch_warnings():
    warnings.filterwarnings("ignore", category=DeprecationWarning)
    import md5, sha

yourcode()

现在您仍然得到所有其他DeprecationWarnings,但不是由以下原因引起的:

import md5, sha

2
这对于执行测试时忽略警告特别有用。使用tox,添加PYTHONWARNINGS=ignoresetenv可以减少输出的脏污。
Kurt Bourbaki

2
对于AWS CLI也是非常有用的。
mckenzm

1
但这并不会忽略弃用警告。请问如何包括那个?
Wey Shi


70

这是一个老问题,但是PEP 565中有一些较新的指南,如果您正在编写python应用程序,则应关闭所有警告,请使用:

import sys
import warnings

if not sys.warnoptions:
    warnings.simplefilter("ignore")

推荐这样做的原因是默认情况下它会关闭所有警告,但至关重要的是允许通过python -W命令行或再次将其打开PYTHONWARNINGS


这是完美的,因为它不会在以后执行时禁用所有警告
Orsiris de Jong


17

如果您知道通常会遇到什么无用的警告,则可以按消息过滤它们。

import warnings

#ignore by message
warnings.filterwarnings("ignore", message="divide by zero encountered in divide")

#part of the message is also okay
warnings.filterwarnings("ignore", message="divide by zero encountered") 
warnings.filterwarnings("ignore", message="invalid value encountered")

0

我意识到这仅适用于特定情况,但是在numpy上下文中我真的很喜欢使用np.errstate

np.sqrt(-1)
__main__:1: RuntimeWarning: invalid value encountered in sqrt
nan

但是,使用np.errstate

with np.errstate(invalid='ignore'):
    np.sqrt(-1)
nan

最好的部分是您可以将其仅应用于非常特定的代码行。


-5

警告通过stderr输出,简单的解决方案是将'2> / dev / null'附加到CLI。对于许多用户来说,这很有意义,例如那些使用python 2.6依赖项(例如yum)的centos 6的用户,并且各种模块都被推到了灭绝的边缘。

对于涉及SNI等的密码学尤其如此。一个人可以使用以下过程中的proc更新2.6以进行HTTPS处理:https : //urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

警告仍然存在,但是您想要的所有内容都已反向移植。尽管stdout内容本身不会更改,但stderr的重定向将使您获得干净的终端/外壳输出。

回应FriendFX。句子(1)用通用解决方案直接回答了这个问题。句子二(2)考虑到了python 2.6特定的引用的anchor re“ disable warnings”,并指出RHEL / centos 6用户不能直接使用2.6。尽管未引用任何具体的警告,但第二(2)款回答了我最经常得到的2.6问题,即密码模块中的缺点以及如何“现代化”(即升级,反向移植,修复)python的HTTPS / TLS性能。第三(3)段仅说明使用重定向和升级模块/依赖项的结果。


4
感谢您抽出宝贵的时间回答。但是,请严格按照主题保留答案:您提到了许多与当前问题无关的事情,例如CentOS,Python 2.6,加密技术,urllib,反向移植。您可以编辑问题以删除这些位。如果您想从OP中了解更多详细信息,请在问题下发表评论。
FriendFX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.