python-telegram-bot AWS部署报__dict__ slot disallowed类型错误
问题根因
TypeError: __dict__ slot disallowed: we already got one报错和python-telegram-bot官方示例代码逻辑无关,属于AWS部署环境的依赖兼容问题,本地开发环境能正常运行是因为本地依赖和AWS运行环境的依赖存在差异,常见触发原因有两个:
- 部署时直接将本地Windows/macOS/其他架构Linux环境下安装的第三方依赖包打包上传到AWS,带C扩展的二进制依赖和AWS的Amazon Linux运行环境(含Graviton ARM架构实例)不兼容
- 部署时未做Python虚拟环境隔离,代码运行时加载了AWS系统预装的旧版本依赖(核心冲突为旧版
attrs库,该报错就是由attrs库抛出),和python-telegram-bot要求的依赖版本不匹配
解决步骤
按顺序操作即可修复:
- 隔离运行环境,避免系统依赖干扰
不管是EC2/ECS还是Lambda部署,都不要直接使用系统全局的Python包:- EC2/ECS部署:先在实例内创建独立虚拟环境,后续所有依赖安装、代码运行都在虚拟环境内执行
python3 -m venv venv source venv/bin/activate pip install --upgrade pip - Lambda部署:不要直接打包本地开发环境的依赖上传,使用和Lambda运行时Python版本、CPU架构完全匹配的Amazon Linux构建环境安装依赖后再打包。
- EC2/ECS部署:先在实例内创建独立虚拟环境,后续所有依赖安装、代码运行都在虚拟环境内执行
- 安装匹配版本的依赖
你贴的示例代码是基于python-telegram-bot v13.x版本的同步API编写,不要安装v20+版本(v20改为全异步API,和示例代码不兼容),固定版本安装即可:
安装完成后强制重装兼容版本的attrs,修复版本冲突:pip install python-telegram-bot==13.15pip install --force-reinstall "attrs>=21.3.0" - 配置环境变量彻底屏蔽全局包干扰
在启动bot的脚本最开头添加环境变量配置,或直接在AWS控制台的环境变量配置项中添加:
该配置会让Python解释器忽略系统全局、用户目录下预装的第三方包,仅加载你自己部署的项目目录/虚拟环境内的依赖,彻底避免预装包冲突。export PYTHONNOUSERSITE=1
验证方法
部署完成后先在运行环境中执行pip list | grep -E "attrs|python-telegram-bot|cachetools",确认python-telegram-bot为13.x版本、attrs版本不低于21.3.0,再启动bot即可正常运行,不会再抛出该slot错误。
内容的提问来源于stack exchange,提问作者Baris
相关产品推荐
相关产品推荐

