VSCode重启后Python 3.9下Telethon/asyncio脚本启动失败,报KeyError与TypeError错误
我之前也碰到过类似的asyncio和Telethon在VSCode终端里的奇怪问题,结合你给出的报错信息,大概率是VSCode重启后终端的事件循环环境被干扰了,或者Python的selectors模块状态异常。下面给你几个可以快速排查和解决的步骤:
一、彻底清理VSCode及终端残留进程
有时候VSCode的“重启”操作并不彻底,后台残留的终端进程会搞乱asyncio的文件描述符(就是报错里提到的fd=6)。建议:
- 完全退出VSCode(MacOS可以按
Cmd+Q彻底关闭,确保后台进程也终止) - 重新打开VSCode后,一定要新开一个集成终端窗口,不要复用之前的终端会话,再运行你的脚本
二、强制指定asyncio事件循环策略
你的报错涉及到_UnixSelectorEventLoop的异常,Python 3.9在MacOS环境下自动选择的事件循环可能存在兼容性问题。可以在脚本的最开头添加以下代码,强制指定稳定的事件循环:
import asyncio import platform # 针对MacOS系统修复事件循环策略 if platform.system() == 'Darwin': asyncio.set_event_loop_policy(asyncio.DefaultEventLoopPolicy()) # 或者直接强制使用SelectorEventLoop(备选方案) # from asyncio import SelectorEventLoop # asyncio.set_event_loop(SelectorEventLoop()) # 之后再初始化Telethon Client from telethon import TelegramClient # 替换为你的实际API信息 client = TelegramClient("your-session-name", api_id, api_hash)
三、用全新虚拟环境隔离依赖冲突
VSCode安装扩展可能偷偷修改了Python全局环境的依赖(比如某些扩展自带了旧版本的asyncio相关模块),导致和Telethon的依赖冲突。可以创建一个干净的虚拟环境测试:
# 针对Python3.9创建虚拟环境 python3.9 -m venv telethon-venv # 激活虚拟环境(MacOS/Linux) source telethon-venv/bin/activate # 安装最新版Telethon pip install --upgrade telethon # 在虚拟环境中运行脚本 python your-script.py
如果在虚拟环境中能正常运行,说明你的全局Python环境存在依赖污染,建议后续就用这个虚拟环境来运行脚本,或者全局清理冲突的依赖包。
四、排查VSCode扩展与终端设置
有些VSCode的终端类扩展会修改终端的fork/exec行为,导致asyncio的文件描述符泄漏:
- 禁用最近新安装的所有VSCode扩展,然后重启VSCode测试脚本
- 尝试把VSCode的集成终端切换为系统原生终端:打开VSCode设置,搜索
terminal.integrated.defaultProfile.osx,将其改为Terminal.app或iTerm.app,然后在原生终端中运行脚本
对报错的补充说明
你看到的连锁错误其实都是由一个核心问题引发的:
KeyError: '6 is not registered'是因为asyncio事件循环尝试注册一个已经被释放的文件描述符
后续的TypeError: changelist must be an iterable of select.kevent objects和AttributeError都是事件循环在错误处理过程中,内部状态混乱导致的连锁反应,本质还是事件循环的初始化环境异常。
内容来源于stack exchange

