2013-01-22 75 views
152

我正在使用代码使用warnings库引发大量(对于我来说)无用的警告。阅读(/扫描)文档我只找到一种方法to disable warnings for single functions。但我不想改变这么多的代码。如何禁用python警告

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

你会推荐什么?

+4

为什么要禁用警告?短期+长期不能解决/解决它们会更好吗?警告通常会出于某种原因而提出,忽略/消除它们可能会在未来导致更大的问题。 –

+5

你是完全正确的,我给了你一个+1的评论,但正如我写的“此刻”对我毫无用处。 – Framester

+5

@MartinSamson我普遍同意,但有合理的理由忽视警告。我从defusedxml中使用有效的Xpath语法得到了其中的一些:'FutureWarning:此搜索在1.3和更早的版本中被破解,并且将在未来版本中修复。如果你依赖目前的行为,把它改成[这个其他的东西]'。我宁愿忽略现在的警告,等待它被默默地修复,而不是编写不必要的难看的代码,以避免无害的警告。 – Pedro

回答

162

还有-W option

python -W ignore foo.py

213

你看看python文档的suppress warnings部分?

如果您使用的是您知道会提出一个警告,如过时的功能代码,但不希望看到警告,则有可能使用catch_warnings上下文管理器相应的警告:

import warnings 

def fxn(): 
    warnings.warn("deprecated", DeprecationWarning) 

with warnings.catch_warnings(): 
    warnings.simplefilter("ignore") 
    fxn() 

我不纵容它,但你可以很surpress这一切警告:

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 
+0

所以你必须用'with warnings.catch_warnings():'来包装每个文件中的代码:? – Framester

+7

@Framester - 是的,国际海事组织这是抑制特定警告的最干净的方式,警告总体上存在,因为有些事情可能是错误的,所以通过命令行抑制所有警告可能不是最好的选择。 – Mike

+1

@Framester - 我列举了另一个选项以及一个例子......我不喜欢它(因为我在之前的评论中给出了原因),但至少现在您拥有了这些工具。 – Mike

46

你也可以定义一个环境变量(新功能在2010年 - 即蟒蛇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') 
>>> 
+5

FWIW“2010年新功能”意味着这适用于Python 2.7,但不适用于2.6或更高版本的2.x版本。 (我必须去查看它,我仍然在生产Python 2.6 ...) –

+2

没错。 Python添加了2.7点 –

+1

这在执行测试时忽略警告特别有用。使用'tox',在'setenv'中添加'PYTHONWARNINGS = ignore'使得输出变得不那么脏。 –

2

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

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

警告仍然存在,但是您希望的所有内容都可以回移。 stderr的重定向将为您提供干净的终端/ shell输出,尽管stdout内容本身不会改变。

回应FriendFX。第一句(1)以一种通用的解决方案直接回应问题。第二句(2)考虑了引用的锚重新“禁用警告”,这是python 2.6特有的,并指出RHEL/centos 6用户不能直接使用2.6。虽然没有引用特定的警告,但是第二部分(2)回答了我经常在加密模块中遇到的2.6问题,以及如何能够“现代化”(即升级,回溯,修复)python的HTTPS/TLS性能。第三部分(3)仅仅解释了使用重新指导和升级模块/依赖的结果。

+2

感谢您花时间回答。尽管如此,请务必严格按照主题回答:您提到了很多与当前问题无关的问题,例如CentOS,Python 2.6,密码学,urllib,back-porting。您可以编辑您的问题以删除这些位。如果您想了解OP的更多细节,请在该问题下留下评论。 – FriendFX

4

这是一个老问题,但在PEP 565一些较新的指导意见,为如果你正在写一个Python应用程序关闭所有的警告,你应该使用:

import sys 
import warnings 

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

此建议的原因是,它在默认情况下会关闭所有警告,但重要的是允许它们通过命令行上的python -WPYTHONWARNINGS重新打开。