关于AioRedis导入报错duplicate base class TimeoutError

文章介绍了在使用AioRedis2.0.1版本时遇到的TypeError错误,该错误由Python3.11中asyncio.TimeoutError位置改变引起。提供了两种解决方案:降级Python版本或手动修改aioredis库的exceptions.py文件。还分享了一个查找Python包路径的方法,以便在生产环境中进行修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前因:

今天在使用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库中没有及时更新以适应这个变化。

处理方法

要解决这个问题,以后可以尝试以下解决方案之一:

  1. 降级Python版本:考虑在Python 3.11之前的版本中使用aioredis库,例如Python 3.9或Python 3.10。
  2. 更新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编写生产环境的部署脚本就可以一次性的进行替换修改了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ViniJack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值