我正在处理使用warnings
库抛出大量(对我而言)无用警告的代码。阅读(/扫描)文档我只找到了to disable warnings for single functions的方式。但我不想改变这么多的代码。
有没有像python -no-warning foo.py
这样的旗帜?
你会推荐什么?
python -W ignore foo.py
你看过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
您还可以定义一个环境变量(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')
>>>
这是一个老问题,但是在PEP 565中有一些更新的指导,如果你正在编写一个你应该使用的python应用程序来关闭所有警告:
import sys
import warnings
if not sys.warnoptions:
warnings.simplefilter("ignore")
建议这样做的原因是它默认关闭所有警告,但关键是允许它们通过命令行或python -W
上的PYTHONWARNINGS
重新打开。
如果你不想要复杂的东西,那么:
import warnings
warnings.filterwarnings("ignore", category=FutureWarning)
如果您知道通常遇到的无用警告,可以按消息过滤它们。
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")
警告通过stderr输出,简单的解决方案是将'2> / dev / null'附加到CLI。这对许多用户来说很有意义,例如那些使用了python 2.6依赖项(如yum)的centos 6,并且各种模块在其覆盖范围内被推向灭绝的边缘。
对于涉及SNI等的密码学尤其如此。可以使用proc:https://urllib3.readthedocs.io/en/latest/user-guide.html#ssl-py2更新2.6 for HTTPS处理
警告仍然存在,但您想要的所有内容都是后端移植的。虽然stdout内容本身不会改变,但stderr的重定向将为您提供干净的终端/ shell输出。
回应FriendFX。第一句话(1)用通用解决方案直接回答问题。第二句(2)考虑了引用的锚'重新禁用警告',这是python 2.6特定的,并注意到RHEL / centos 6用户不能直接做2.6。虽然没有引用任何具体警告,但第二(2)段回答了2.6问题,我经常得到加密模块中的缺点以及如何“现代化”(即升级,后退,修复)python的HTTPS / TLS性能。第三(3)段仅解释了使用重定向和升级模块/依赖关系的结果。
您可以在main.py的顶部使用此代码:
def warn(*args, **kwargs):
pass
import warnings
warnings.warn = warn