Django项目部署Heroku运行时触发ImportError: win32 only报错
问题根因
报错的核心原因是项目代码或依赖在Linux环境下强制加载了Python asyncio标准库的Windows专属模块asyncio.windows_events。这个模块在代码开头就做了平台校验,只有sys.platform == 'win32'的环境能正常加载,非Windows环境导入会直接抛出win32 only的ImportError,而Heroku的应用运行环境是Ubuntu Linux,自然触发报错。
常见触发场景有三类:
- 本地Windows开发时,在代码里硬编码了
windows_events相关的导入、事件循环配置,没有加平台判断,部署到Linux时直接执行了对应导入逻辑 - 全局依赖清单
requirements.txt里混入了Windows专属的Python包(比如pywin32、winloop这类仅支持Windows的库),部署时被pip安装到Linux环境,启动时自动触发Windows专属模块加载 - ASGI/异步服务配置硬编码了Windows专属的事件循环策略,没有做环境区分
修复方案
按以下顺序排查修复即可解决问题:
- 全局检索项目代码,找到所有引用
windows_events、WindowsProactorEventLoopPolicy、ProactorEventLoop的位置,给这类平台专属逻辑加上系统判断,参考写法:
import sys import asyncio # 仅Windows环境执行专属配置 if sys.platform == "win32": from asyncio.windows_events import ProactorEventLoop asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) else: # Linux/Mac环境使用默认Unix事件循环即可,无需额外配置 asyncio.set_event_loop_policy(asyncio.DefaultEventLoopPolicy())
- 清理
requirements.txt里的平台专属依赖,给仅Windows环境需要的包加上平台安装标记,避免Linux环境强制安装:
标记写法示例:
pywin32==306; sys_platform == 'win32'
加了标记后,pip在非Windows环境安装依赖时会自动跳过对应包,不会引入Windows专属依赖
- 检查Django的ASGI配置、启动脚本,确认没有硬编码Windows专属的事件循环类,Unix环境下不要手动指定Windows相关的事件循环策略,直接用asyncio默认配置即可。
- 修复后可以本地用WSL或者和Heroku运行环境一致的Ubuntu+Python3.10镜像提前跑一次启动流程,确认没有导入报错后再推送部署。
内容的提问来源于stack exchange,提问作者Bitzu
相关产品推荐
相关产品推荐

