如何禁用Python警告?

我正在使用warnings库抛出很多(目前对我来说)无用警告的代码。阅读(/扫描)留档我只找到了方法禁用单个功能的警告。但我不想更改这么多代码。

有没有像python -no-warning foo.py这样的标志?

你会推荐什么?

1431279 次浏览

这是#0选项

python -W ignore foo.py

查看Python文档的暂时抑制警告部分:

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

import warnings
def fxn():warnings.warn("deprecated", DeprecationWarning)
with warnings.catch_warnings():warnings.simplefilter("ignore")fxn()

我不宽恕它,但你可以用这个取消所有警告

import warningswarnings.filterwarnings("ignore")

例如:

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

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

复制到这里…

#0模块的留档:

 #!/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()

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

import md5, sha

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

对于涉及SNI等其他内容的加密尤其如此。可以使用proc更新2.6以进行HTTPS处理:https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2

该警告仍在地方,但你想要的一切是反向的。stderr的重定向将使你获得干净的终端/shell输出,尽管stdout内容本身不会改变。

句子2(2)考虑了引用的锚re'disable警告',这是python 2.6特定的,并指出RHEL/centos 6用户不能直接使用2.6.虽然没有引用特定的警告,但第2(2)段回答了我最常得到的2.6问题,即密码学模块中的缺点以及如何“现代化”(即升级、后移、修复)python的HTTPS/TLS性能.第3(3)段仅仅解释了使用重定向和升级模块/依赖项的结果。

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

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

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

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

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

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

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

我意识到这只适用于一小部分情况,但在numpy上下文中,我真的很喜欢使用np.errstate

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

但是,使用np.errstate

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

最好的部分是您只能将其应用于非常具体的代码行。


更多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...
import sysif not sys.warnoptions:import warningswarnings.simplefilter("ignore")

在处理文件或添加新功能以重新启用警告时,将ignore更改为default

不要把它弄复杂,就用这两条线

import warningswarnings.filterwarnings('ignore')

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

pip install shutup

然后在代码顶部添加:

import shutup; shutup.please()

免责声明:我是那个仓库的所有者。我在第五次需要它之后写了它,但找不到任何简单的工作。