从Windows拷贝文件到树莓派运行Python报__aenter__属性错误
问题场景
- 通过WinSCP将完整项目文件夹从Windows设备传输至树莓派
- 安装requirements.txt内的依赖、完成更新校验后启动程序,触发Windows桌面端运行时从未出现的报错
- 树莓派端使用Thonny编辑器,运行环境为Python 3.9.2,编辑器侧边栏同步弹出语法警告
运行报错追踪
Traceback (most recent call last): File "[directory]/main.py", line 37, in <module> asyncio.run(main()) File "/usr/lib/python3.9/asyncio/runners.py", line 44, in run return loop.run_until_complete(main) File "/usr/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete return future.result() file "[directory]/main.py" line 33, in main async with bot: AttributeError: __aenter__
Thonny编辑器警告信息
第33行:异步上下文管理器'Bot'未实现__aenter__和__aexit__方法。 *提示说明:代码对一个未实现异步上下文管理协议的对象使用了异步上下文管理器语法,Python版本低于3.5时不会弹出该提示*
问题根因
不存在遗漏的树莓派系统配置,核心原因是双端Python环境的依赖版本不匹配:
Windows本地使用的Bot类框架(常见如discord.py、py-cord、nextcord等)为支持异步上下文管理器协议的高版本,类内实现了__aenter__、__aexit__方法,因此async with bot:写法可正常运行;树莓派端通过requirements安装的是兼容Python3.9的低版本框架,该版本Bot类未实现异步上下文管理逻辑,直接触发属性错误。
该问题和WinSCP文件传输操作无关,纯为依赖版本不一致导致,属于跨设备传输Python项目的常见问题,诱因通常是requirements.txt未锁定依赖精确版本号,pip默认拉取的包版本和本地开发环境存在差异。
解决步骤
- 回到Windows端的项目开发环境,执行
pip freeze查看本地安装的Bot对应框架的精确版本号,例如discord.py 2.3.2 - 注意Thonny默认使用自身内置的Python环境,不要在系统全局终端执行装包命令,直接打开Thonny底部的Shell面板,先卸载当前装错版本的框架:如果使用的是discord.py就执行
pip uninstall -y discord.py - 在Thonny的Shell中安装和Windows端完全一致版本的框架,例如
pip install discord.py==2.3.2(替换为你本地实际的框架名和版本号) - 安装完成后重新运行程序即可正常启动,不需要额外修改代码或调整系统参数。
内容的提问来源于stack exchange,提问作者moonsugar
相关产品推荐
相关产品推荐

