我正在处理使用warnings
库抛出大量(目前对我而言)无用警告的代码。阅读(/扫描)文档我只找到了to disable warnings for single functions的方法。但我不想改变这么多的代码。
是否有像python -no-warning foo.py
这样的旗帜?
你会推荐什么?
答案 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)
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 -W
或PYTHONWARNINGS
重新启用。
答案 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)
由于“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