Python3.11升级到高版本-aioredis兼容问题
一、背景
Python3.11之前使用Fastapi框架并且使用了最新的aioredis异步库,能够正常运行业务。但是后续我们引入了langchain、langgraph需要一些流式输出的高级功能,所以把Python版本直接从3.10升级到了3.12。
但是随之而来的问题是,项目中涉及操作redis的部分代码报错了,报错内容大致如下:
File "f:\all_django_project\pyscript_demo\main.py", line 2, in <module>import aioredisFile "F:\all_django_project\pyscript_demo\fast_api_env\Lib\site-packages\aioredis\__init__.py", line 1, in <module>from aioredis.client import Redis, StrictRedisFile "F:\all_django_project\pyscript_demo\fast_api_env\Lib\site-packages\aioredis\client.py", line 32, in <module>from aioredis.connection import (File "F:\all_django_project\pyscript_demo\fast_api_env\Lib\site-packages\aioredis\connection.py", line 33, in <module>from .exceptions import (File "F:\all_django_project\pyscript_demo\fast_api_env\Lib\site-packages\aioredis\exceptions.py", line 14, in <module>class TimeoutError(asyncio.TimeoutError, builtins.TimeoutError, RedisError):
TypeError: duplicate base class TimeoutError
网上找到了遇到相同问题的处理方案,但是都觉得不够优雅,直接去改源码包的代码进行兼容修复。 这个方案可能针对这种不变动源码的情况下比较好,例如你这个是旧版本的项目,基本不会动这个依赖库或者有重新部署的需求。 但总归不是很优雅,也不灵活
万一哪天重新部署了,这个跑不起来,自己都忘记了还有改源码这个步骤,呵呵。 所以本文给出更优雅的解决方案
二、解决方案
issuse原文: https://github.com/aio-libs-abandoned/aioredis-py/issues/1443
解决方案也很简单, 只要你的redis-py版本大于4.2.0 rc1+的版本, 可以直接通过以下代码进行兼容即可:
from redis import asyncio as aioredis
不需要修改aioredis库的源代码, 只需要修改你之前导入aioredis的方式即可, 一行代码即可解决.
三、总结
遇到这种类似问题,除了搜索引擎本身可以去解决问题,也就可以搜索相关项目的github的issue列表,或者github直接搜索,有可能得到的解决方案更为优雅、更可靠.
一直不推荐修改源码库的方式去修复这些兼容性问题,因为你的项目一旦迁移之后,重新pip装依赖,之前改源码这个事情大部分人是不会记得的,并且可维护性差.