gpt4 book ai didi

python - 禁用 Python 3.2 资源警告

转载 作者:IT老高 更新时间:2023-10-28 22:20:47 25 4
gpt4 key购买 nike

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)

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

最佳答案

我找到了罪魁祸首。您说您在导入时设置了过滤器。但是,从 Python 3.2 开始,单元测试模块已更新为将警告过滤器设置为默认值。见 Section 29.5.5 .基本上,unittest 会在完成模块导入后覆盖您的警告过滤器首选项。

例如。

my_tests.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 似乎会在每次测试后重置警告过滤器。因此,您将在每次测试开始时清除过滤器。可能最好使用装饰器来包装您的测试函数。

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

关于python - 禁用 Python 3.2 资源警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26563711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com