关于AioRedis导入报错duplicate base class TimeoutError
前因:
今天在使用AioRedis(aioredis==2.0.1)的时候,因为换了环境,所以之前遇到的问题又重新出现了。熟悉的网站都搜了一遍,都没找到对口记录这个问题的文章,所以就做了个笔记,以防自己再次处理的是找不到相关信息。
导入AioRedis的报错
报错信息如下:
File "/xxx/xxx- venv/lib/python3.11/site-packages/aioredis/exceptions.py",
line 14,
in <module>class TimeoutError(asyncio.TimeoutError, builtins.TimeoutError, RedisError):
builtins.TypeError: duplicate base class TimeoutError
问题解析
这个错误是由于aioredis库在Python 3.11中的一个兼容性问题引起的。在Python 3.11中,asyncio.TimeoutError被移动到了asyncio.exceptions模块中,并且在aioredis库中没有及时更新以适应这个变化。
处理方法
要解决这个问题,以后可以尝试以下解决方案之一:
- 降级Python版本:考虑在Python 3.11之前的版本中使用aioredis库,例如Python 3.9或Python 3.10。
- 更新aioredis库:检查是否有可用的更新版本,其中已经修复了这个问题。你可以使用以下命令来安装最新版本:
pip install --upgrade aioredis
如果有可用的修复版本,这将安装最新的aioredis库,并解决你遇到的问题。
在当前没有最新版本的处理方法:
手动修复问题:如果没有可用的更新版本,你可以尝试手动修复这个问题。在你的Python环境中,找到aioredis库的安装路径,并修改exceptions.py文件,将以下行:
# class TimeoutError(asyncio.TimeoutError, builtins.TimeoutError, RedisError):
# 把上面的代码修改为下面的
class TimeoutError(asyncio.exceptions.TimeoutError, builtins.TimeoutError, RedisError):
保存文件并重新运行你的代码,这样应该可以解决问题。
如果都是不行,就直接删除了 asyncio.exceptions.TimeoutError 这个继承,修改为:
class TimeoutError(builtins.TimeoutError, RedisError):
对于手动修改的这种解决方案,由于修改了库的源代码,当你升级aioredis库时,可能会导致冲突或覆盖你的修改。因此,这只是一个临时的解决方案,你可能需要关注官方库是否发布了修复版本,并及时更新到最新版本。
修改文件路径问题 (2023-07-28)
因为经常都是在云服务器跑,或者生产环境跑,所以就算使用了pip3 install -r requirements 按照测试环境下安装包,但是去到生产环境的时候,还是需要找到对应的包路径下进行修改或者替换。不知道使用什么方法去寻找对应的包路径。所以我这里提供一个比较简单的方法给大家:
# 使用你的python3进入编译器环境
# 例如我的是python3.11,进入后执行下面的命令
import sys
sys.path
# 对应会输出['', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/xxx/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']
# 其中。'/home/xxx/.local/lib/python3.10/site-packages' 就是你的包管理器下的路径
exit()
然后直接运行
vim /home/xxx/.local/lib/python3.10/site-packages/aioredis/exceptions.py
# 运行上面的命令进行编辑 或者直接找到路径进行替换
以上方法适用于所有进行修改定制的包的生产环境部署,当然这个方法是比较麻烦以及low的,但是胜在简单。
有时间的朋友可以直接使用python编写生产环境的部署脚本就可以一次性的进行替换修改了