如何忽略 Python 中的弃用警告

How to ignore deprecation warnings in Python

提问人:Mohammed 提问时间:5/19/2009 最后编辑:kaya3Mohammed 更新时间:11/4/2022 访问量:341599

问:

我一直得到这个:

DeprecationWarning: integer argument expected, got float

如何使此消息消失?有没有办法避免 Python 中的警告?

Python 警告已 弃用

评论

13赞 polvoazul 7/1/2021
当其他方法不起作用时:.然后在代码的顶部。这将禁用所有警告。$ pip install shutupimport shutup;shutup.please()
0赞 Wolfgang Fahl 11/18/2023
截至 2023 年 11 月 18 日的 341k 浏览量显示了这有多糟糕。为什么没有报告错误,一旦注意到这些警告消息就很难关闭它们?

答:

5赞 shylent 5/19/2009 #1

传递正确的参数?:P

更严重的是,您可以在命令行上将参数 -Wi::D eprecationWarning 传递给解释器以忽略弃用警告。

3赞 Gonzalo Quero 5/19/2009 #2

将参数转换为 int。就这么简单

int(argument)
153赞 Stephan202 5/19/2009 #3

警告模块的文档中:

 #!/usr/bin/env python -W ignore::DeprecationWarning

如果您使用的是 Windows:作为参数传递给 Python。更好的是解决这个问题,通过强制转换为 int-W ignore::DeprecationWarning

(请注意,在 Python 3.2 中,默认情况下会忽略弃用警告。

评论

10赞 weronika 10/5/2011
我希望我能完成这项工作......我收到错误。如果我在命令行上使用该选项运行 python,它会起作用,但 /usr/bin/env 不处理它。/usr/bin/env: python -W ignore::DeprecationWarning: No such file or directory-W ignore::DeprecationWarning
7赞 Daniel Miles 12/17/2011
似乎是一个仅限 Windows 的解决方案。
23赞 yvess 2/14/2014
您可以设置 env 变量 PYTHONWARNINGS 这对我有用,以禁用来自 sorl 的 django json 剥夺警告export PYTHONWARNINGS="ignore::DeprecationWarning:simplejson"
0赞 allanberry 5/16/2014
@yvess,如果这是一个答案,我会投赞成票。似乎是忽略系统范围内特定警告的干净方法。我把它放在我的 ~/.profile 中。效果很好。
0赞 Krishna Oza 2/25/2016
嗨,我们能否将此弃用警告消息转换为信息类型的消息。我想要的只是在控制台上显示消息,不要被归类为任何类型的警告。
-3赞 SpliFF 5/19/2009 #4

不要为此而殴打你,而是警告你,当你下次升级 python 时,你正在做的事情可能会停止工作。转换为 int 并完成它。

顺便说一句。您还可以编写自己的警告处理程序。只需分配一个不执行任何操作的函数即可。如何将 python 警告重定向到自定义流?

评论

4赞 Christopher Barber 11/12/2017
只有当它确实是他自己的代码而不是来自某个第三方包时,该建议才有效。
315赞 ismail 5/19/2009 #5

你应该修复你的代码,但以防万一,

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

评论

3赞 zbinsd 9/13/2013
使用 iPython 为我工作
61赞 user1244215 10/22/2013
这对我根本不起作用,仍然看到弃用警告。
20赞 Jack Kelly 5/24/2014
@user1244215我可能是错的,但我认为你在代码中运行的位置很重要。我认为您必须在导入发出警告的库后运行它,尽管我可能弄错了。warnings.filterwarnings("ignore", category=DeprecationWarning)
1赞 ismail 1/28/2017
需要@CodingYourLife类别,因此您仍会看到其他类型的警告,如 RuntimeWarning 等。
5赞 sedeh 7/24/2017
就我而言,导致警告的代码是 .我必须紧接在导入之前才能让它工作。from xgboost import XGBClassifierwarnings.filterwarnings("ignore", category=DeprecationWarning)
237赞 Eddy Pronk 10/29/2009 #6

我有这些:

/home/eddyp/virtualenv/lib/python2.6/site-packages/Twisted-8.2.0-py2.6-linux-x86_64.egg/twisted/persisted/sob.py:12:
DeprecationWarning: the md5 module is deprecated; use hashlib instead import os, md5, sys

/home/eddyp/virtualenv/lib/python2.6/site-packages/Twisted-8.2.0-py2.6-linux-x86_64.egg/twisted/python/filepath.py:12:
DeprecationWarning: the sha module is deprecated; use the hashlib module instead import sha

用以下方法修复它:

import warnings

with warnings.catch_warnings():
    warnings.filterwarnings("ignore",category=DeprecationWarning)
    import md5, sha

yourcode()

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

import md5, sha

评论

3赞 weronika 10/5/2011
太棒了,非常感谢!!(我花了一点时间才意识到我也可以将非导入代码位包装在其中,因为某些包在导入后使用时也会生成 DeprecationWarnings。非常好的方法,可以只静音我已经看过并决定要忽略的特定弃用警告。
2赞 Maddes 1/9/2022
适用于 Windows 和 Linux,并且完全独立于提供给可执行文件的任何参数。所以一直有效。此外,它仅禁用显式库的弃用警告,因此当下一个库被弃用时,您仍会收到更新源代码的通知。
32赞 Tristan Havelick 3/5/2010 #7

我发现最干净的方法(尤其是在 Windows 上)是将以下内容添加到 C:\Python26\Lib\site-packages\sitecustomize.py:

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

请注意,我必须创建此文件。当然,如果您的路径不同,请将路径更改为 python。

8赞 Trideep Rath 12/5/2017 #8

如果只想忽略函数中的警告,可以执行以下操作。

import warnings
from functools import wraps


def ignore_warnings(f):
    @wraps(f)
    def inner(*args, **kwargs):
        with warnings.catch_warnings(record=True) as w:
            warnings.simplefilter("ignore")
            response = f(*args, **kwargs)
        return response
    return inner

@ignore_warnings
def foo(arg1, arg2):
    ...
    write your code here without warnings
    ...

@ignore_warnings
def foo2(arg1, arg2, arg3):
    ...
    write your code here without warnings
    ...

只需在要忽略所有警告的函数上添加@ignore_warnings装饰器

61赞 seralouk 5/25/2018 #9

这些答案都不适合我,所以我将发布我的方法来解决此问题。我在 main.py 脚本的开头使用以下内容,它工作正常。


按原样使用以下内容(复制粘贴):

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn

例:

import "blabla"
import "blabla"

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn

# more code here...
# more code here...

评论

7赞 cxxl 5/30/2018
当所有其他解决方案都不起作用时,这奏效了。谢谢!
2赞 ingyhere 8/14/2019
在 3.7.3 中不适用于 AstroPy 弃用警告。:(
1赞 tCot 4/26/2022
为整个应用程序工作!非常感谢
1赞 Kentgrav 6/16/2022
相同。其他解决方案都不起作用。这是唯一有效的方法。
2赞 Philippe Remy 3/7/2023
对于那些想要一个班轮来回答这个答案的人:warnings.warn = lambda *args, **kwargs: None
19赞 Marcello DeSales 5/2/2019 #10

Docker 解决方案

  • 在运行 python 应用程序之前禁用所有警告
    • 您也可以禁用 dockerized 测试
ENV PYTHONWARNINGS="ignore::DeprecationWarning"
-1赞 Statham 8/16/2019 #11

如果您知道自己在做什么,另一种方法是简单地找到警告您的文件(文件的路径显示在警告信息中),注释生成警告的行。

评论

1赞 Hlib Babii 5/22/2021
如果警告来自第三方库,该怎么办?
1赞 S3DEV 2/3/2023
通常,生成警告的行是程序运行所必需的。当然是一个次优建议。
7赞 Dipen Gajjar 11/19/2019 #12

蟒蛇 3

在编写代码之前,只需写下以下易于记忆的行:

import warnings

warnings.filterwarnings("ignore")
2赞 Ashish Anand 12/15/2019 #13

对于 python 3,只需编写以下代码即可忽略所有警告。

from warnings import filterwarnings
filterwarnings("ignore")
3赞 Amar Kumar 3/8/2020 #14

如果您使用的是 Python3,请尝试以下代码:

import sys

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

或者试试这个...

import warnings

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

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

或者试试这个...

import warnings
warnings.filterwarnings("ignore")
8赞 ruloweb 9/18/2020 #15

如果使用日志记录 (https://docs.python.org/3/library/logging.html) 来格式化或重定向 ERROR、NOTICE 和 DEBUG 消息,则可以将 WARNINGS 从警告系统重定向到日志记录系统:

logging.captureWarnings(True)

它将捕获带有标记“py.warnings”的警告。此外,如果要在不记录的情况下丢弃这些警告,则可以使用以下命令将日志记录级别设置为 ERROR:

logging.getLogger("py.warnings").setLevel(logging.ERROR)

它将导致所有这些警告被忽略,而不会出现在您的终端或其他任何地方。

请参阅 https://docs.python.org/3/library/warnings.htmlhttps://docs.python.org/3/library/logging.html#logging.captureWarningscaptureWarnings 设置为 True 不会捕获警告

就我而言,我使用日志记录系统格式化了所有异常,但警告(例如 scikit-learn)不受影响。

-10赞 Aqueel khaja 9/20/2020 #16

注释掉以下文件中的警告行

lib64/python2.7/site-packages/cryptography/__init__.py
-2赞 Lorenzo 11/4/2022 #17

有点粗糙,但在上述方法没有之后,它对我有用。

./myscrypt.py 2>/dev/null

0赞 Logan Walker 12/12/2023 #18

为了添加到以前的解决方案中,如果在某些并行应用程序(例如使用 )中继续收到警告,则可能还需要将警告筛选器传递给子进程。你可以用这样的东西来做到这一点:multiprocessing

import sys, os

if not sys.warnoptions:
    import warnings
    warnings.simplefilter("ignore")
    
    os.environ["PYTHONWARNINGS"] = "ignore"

添加该行将导致子进程也忽略警告。os.environ