You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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专属的事件循环策略,没有做环境区分
修复方案

按以下顺序排查修复即可解决问题:

  1. 全局检索项目代码,找到所有引用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())
  1. 清理requirements.txt里的平台专属依赖,给仅Windows环境需要的包加上平台安装标记,避免Linux环境强制安装:

标记写法示例:pywin32==306; sys_platform == 'win32'
加了标记后,pip在非Windows环境安装依赖时会自动跳过对应包,不会引入Windows专属依赖

  1. 检查Django的ASGI配置、启动脚本,确认没有硬编码Windows专属的事件循环类,Unix环境下不要手动指定Windows相关的事件循环策略,直接用asyncio默认配置即可。
  2. 修复后可以本地用WSL或者和Heroku运行环境一致的Ubuntu+Python3.10镜像提前跑一次启动流程,确认没有导入报错后再推送部署。

内容的提问来源于stack exchange,提问作者Bitzu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 20:24:28