升级至Python3.9+Django3.2后执行createsuperuser报_UnixSelectorEventLoop属性错误
问题原因
这个报错的根本原因是依赖库eventlet==0.32.0与Python 3.9的标准库asyncio模块存在兼容冲突。
eventlet会默认对Python标准库的网络、IO相关模块执行猴子补丁(Monkey Patch),0.32.0版本的eventlet没有适配Python 3.9对asyncio事件循环、selector选择器的调整逻辑,修改后的selector实现和标准库asyncio的调用逻辑不匹配,最终抛出你看到的TypeError: changelist must be an iterable of select.kevent objects错误,后续的_signal_handlers属性丢失报错也是事件循环初始化中途失败导致的衍生问题。
解决方案
你可以任选以下一种方案解决:
- 升级eventlet到兼容Python3.9的版本,要求版本不低于0.33.0:
修改requirements.txt中对应的行即可永久生效。pip install eventlet>=0.33.0 - 如果你的项目没有用到eventlet提供的协程相关能力,可以直接移除该依赖:
同时删除requirements.txt中的pip uninstall eventleteventlet==0.32.0行即可。
你可以先临时卸载eventlet后重试python manage.py createsuperuser或者启动/终止runserver操作,即可验证报错是否消失。
内容的提问来源于stack exchange,提问作者Jonathan Viccary
相关产品推荐
相关产品推荐

