如何禁用python警告

问题描述 投票:287回答:8

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

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

你会推荐什么?

python suppress-warnings
8个回答
306
投票

-W option

python -W ignore foo.py


417
投票

你看过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

72
投票

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

54
投票

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

import sys
import warnings

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

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


27
投票

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

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

1
投票

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

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

-1
投票

警告通过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)段仅解释了使用重定向和升级模块/依赖关系的结果。


-5
投票

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

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn
© www.soinside.com 2019 - 2024. All rights reserved.