如何抑制来自 aiohttp 的这些虚假警告?
How to suppress these fake warnings coming from aiohttp?
我有一些代码可以使用 asyncio
和 aiohttp
向远程站点发出请求。
import aiohttp, asyncio
async def f():
session = aiohttp.ClientSession()
async with session.get('https://httpbin.org/get') as response:
pass
asyncio.run(f())
当我运行它时,它产生
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7f56796b3d68>
Unclosed connector
connections: ['[(<aiohttp.client_proto.ResponseHandler object at 0x7f56793836a8>, 0.0)]']
connector: <aiohttp.connector.TCPConnector object at 0x7f56796b3f98>
现在,不推荐我提出请求的方式(出于各种原因),这就是我收到这些消息的原因。不过,他们肯定拦不住我,所以我只希望再也见不到他们了。
我合理地假设它们是正常警告并尝试通过 -Wignore
命令行选项禁用它们,以及将以下代码放在脚本的开头
import warnings
warnings.filterwarnings('ignore')
但是消息不断出现。怎么会?我怎样才能抑制它们?
事实证明,aiohttp
不仅会发出带有该文本的正常警告,还会在异常 [=] 期间使用相同的消息调用循环的 exception 处理程序14=]调用。
ClientSession
的来源:
def __del__(self, _warnings: Any=warnings) -> None:
if self._protocol is not None:
...
_warnings.warn('Unclosed connection {!r}'.format(self),
ResourceWarning,
**kwargs)
...
context = {'client_connection': self,
'message': 'Unclosed connection'}
...
self._loop.call_exception_handler(context) # <---
因此,如果您只想通过循环的异常处理程序抑制来自 aiohttp
库 和 的警告,您必须要么
替换循环的默认异常处理程序
例如,使用空操作函数:
async def f():
asyncio.get_running_loop().set_exception_handler(lambda loop, context: None)
...
# No output
或
更改整个 asyncio
模块的日志记录级别
因为循环的默认异常处理程序使用 logging.ERROR
级别记录异常消息,您必须将级别设置为 logging.CRITICAL
import logging
async def f():
logging.getLogger('asyncio').setLevel(logging.CRITICAL)
...
# No output
我有一些代码可以使用 asyncio
和 aiohttp
向远程站点发出请求。
import aiohttp, asyncio
async def f():
session = aiohttp.ClientSession()
async with session.get('https://httpbin.org/get') as response:
pass
asyncio.run(f())
当我运行它时,它产生
Unclosed client session
client_session: <aiohttp.client.ClientSession object at 0x7f56796b3d68>
Unclosed connector
connections: ['[(<aiohttp.client_proto.ResponseHandler object at 0x7f56793836a8>, 0.0)]']
connector: <aiohttp.connector.TCPConnector object at 0x7f56796b3f98>
现在,不推荐我提出请求的方式(出于各种原因),这就是我收到这些消息的原因。不过,他们肯定拦不住我,所以我只希望再也见不到他们了。
我合理地假设它们是正常警告并尝试通过 -Wignore
命令行选项禁用它们,以及将以下代码放在脚本的开头
import warnings
warnings.filterwarnings('ignore')
但是消息不断出现。怎么会?我怎样才能抑制它们?
事实证明,aiohttp
不仅会发出带有该文本的正常警告,还会在异常 [=] 期间使用相同的消息调用循环的 exception 处理程序14=]调用。
ClientSession
的来源:
def __del__(self, _warnings: Any=warnings) -> None:
if self._protocol is not None:
...
_warnings.warn('Unclosed connection {!r}'.format(self),
ResourceWarning,
**kwargs)
...
context = {'client_connection': self,
'message': 'Unclosed connection'}
...
self._loop.call_exception_handler(context) # <---
因此,如果您只想通过循环的异常处理程序抑制来自 aiohttp
库 和 的警告,您必须要么
替换循环的默认异常处理程序
例如,使用空操作函数:
async def f():
asyncio.get_running_loop().set_exception_handler(lambda loop, context: None)
...
# No output
或
更改整个 asyncio
模块的日志记录级别
因为循环的默认异常处理程序使用 logging.ERROR
级别记录异常消息,您必须将级别设置为 logging.CRITICAL
import logging
async def f():
logging.getLogger('asyncio').setLevel(logging.CRITICAL)
...
# No output