如何禁用python警告

时间:2013-01-22 16:26:49

标签: python suppress-warnings

我正在处理使用warnings库抛出大量(目前对我而言)无用警告的代码。阅读(/扫描)文档我只找到了to disable warnings for single functions的方法。但我不想改变这么多的代码。

是否有像python -no-warning foo.py这样的旗帜?

你会推荐什么?

13 个答案:

答案 0 :(得分:380)

你看过python docs的suppress warnings部分吗?

  

如果您使用的代码会引发警告,例如已弃用的函数,但不希望看到警告,则可以使用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

答案 1 :(得分:282)

-W option

python -W ignore foo.py

答案 2 :(得分:68)

您还可以定义环境变量(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')
>>> 

答案 3 :(得分:52)

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

import sys
import warnings

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

建议这样做的原因是它默认关闭所有警告,但关键是允许它们通过命令行上的python -WPYTHONWARNINGS重新启用。

答案 4 :(得分:16)

如果您不想要复杂的东西,那么:

import warnings
warnings.filterwarnings("ignore", category=FutureWarning)

答案 5 :(得分:6)

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

在处理文件或添加新功能以重新启用警告时将忽略更改为默认值。

答案 6 :(得分:4)

不复杂,就用这两行

import warnings
warnings.filterwarnings('ignore')

答案 7 :(得分:3)

我意识到这仅适用于特定情况,但是在*it->end()上下文中,我真的很喜欢使用np.errstate

  std::transform(it->begin(), it->end(), it->begin(),
                   [](char c) { return std::tolower(c); });
numpy

但是,使用np.sqrt(-1)

__main__:1: RuntimeWarning: invalid value encountered in sqrt
nan
np.errstate

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

答案 8 :(得分:1)


更多pythonic方式来忽略警告


由于“warning.filterwarnings()”没有抑制所有警告,我建议您使用以下方法:

import logging
    
for name in logging.Logger.manager.loggerDict.keys():
    logging.getLogger(name).setLevel(logging.CRITICAL)

#rest of the code starts here...

或,

如果你只想抑制一组特定的警告,那么你可以这样过滤:

import logging
    
for name in logging.Logger.manager.loggerDict.keys():
    if ('boto' in name) or ('urllib3' in name) or ('s3transfer' in name) or ('boto3' in name) or ('botocore' in name) or ('nose' in name):
            logging.getLogger(name).setLevel(logging.CRITICAL)

#rest of the code starts here...

答案 9 :(得分:0)

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

对于涉及SNI等的密码学尤其如此。可以使用proc在以下位置更新2.6 for HTTPS处理: https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

警告仍然存在,但您想要的所有内容都是后端移植的。虽然stdout内容本身不会改变,但stderr的重定向将为您提供干净的终端/ shell输出。

回复FriendFX。第一句话(1)用通用解决方案直接回答问题。第二句(2)考虑了引用的锚'重新禁用警告',这是python 2.6特定的,并注意到RHEL / centos 6用户不能直接做2.6。虽然没有引用任何具体警告,但第二(2)段回答了2.6问题,我经常得到加密模块中的缺点以及如何“现代化”(即升级,后退,修复)python的HTTPS / TLS性能。第三(3)段仅解释了使用重定向和升级模块/依赖关系的结果。

答案 10 :(得分:0)

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

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")

答案 11 :(得分:0)

当所有其他方法都失败时,请使用:https://github.com/polvoazul/shutup

pip install shutup

然后添加到代码的顶部:

import shutup; shutup.please()

答案 12 :(得分:-2)

您可以在main.py的顶部使用以下代码:

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn