禁用Python3.2资源警告

2024-04-20 04:36:49 发布

您现在位置:Python中文网/ 问答频道 /正文

Python 3.2为未关闭的系统资源(网络套接字、文件)引入了ResourceWarning

尽管代码在生产环境中运行得很干净,但在运行单元测试时,由于在出现警告的地方使用了第三方库,我收到了很多以下警告。我可以修复库,但另一方面,在测试运行期间忽略它要简单得多。

 block_io-python/block_io/__init__.py:182: ResourceWarning: unclosed <ssl.SSLSocket fd=11, family=AddressFamily.AF_INET, type=SocketType.SOCK_STREAM, proto=6, laddr=('x', 58395), raddr=('x, 443)>

如何禁用这些警告?我尝试了以下方法,但没有效果:

 warnings.filterwarnings("ignore", category=ResourceWarning)

(在单元测试导入期间运行)。


Tags: 文件代码pyio网络警告sslinit
3条回答

我找到了罪犯。你说你在导入时设置了过滤器。但是,自Python 3.2以来,unittest模块已经更新,将警告过滤器设置为默认值。见Section 29.5.5。基本上,unittest在导入完模块后覆盖警告过滤器首选项。

例如。

我的测验.py

import socket
import unittest
import warnings

warnings.simplefilter("ignore", ResourceWarning)

def abusesocket():
    s = socket.socket()
    s.connect(("www.google.com", 80))

class Test(unittest.TestCase):

    def test1(self):
        print("test1")
        abusesocket()
        print("module import warning filter nixed")

    def test2(self):
        print("test2")
        warnings.simplefilter("ignore", ResourceWarning)
        abusesocket()
        print("higher warning filter okay")

给出以下输出

$ python3 -m unittest  my_tests.py 
test1
/home/user/my_tests.py:15: ResourceWarning: unclosed <socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketType.SOCK_STREAM, proto=0, laddr=('x.x.x.x', 52332), raddr=('31.55.166.217', 80)>
  abusesocket()
module import warning filter nixed
.test2
higher warning filter okay
.
----------------------------------------------------------------------
Ran 2 tests in 0.347s

OK

解决方案

每次测试后出现unittest以重置警告筛选器。所以每次测试开始时都要清除过滤器。最好使用decorator包装测试函数。

def ignore_warnings(test_func):
    def do_test(self, *args, **kwargs):
        with warnings.catch_warnings():
            warnings.simplefilter("ignore", ResourceWarning)
            test_func(self, *args, **kwargs)
    return do_test

class Test(unittest.TestCase):

    @ignore_warnings
    def test1(self):
        abusesocket()

unittest.main(警告='ignore')

这个选择对我有效:

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

见:Standard Library docs - Overriding the default filter

相关问题 更多 >