部署Django应用时出现‘cannot import name _imaging’错误及mod_wsgi版本问题求助
看起来你遇到的这个 Django cannot import name _imaging 错误,核心原因已经被你定位到啦——mod_wsgi 是针对 Python 3.4 编译的,但你当前使用的是 Python 3.5。这种版本不匹配会导致 mod_wsgi 加载的是 Python 3.4 的库路径,而你的 Django 应用依赖的 Pillow(_imaging 是它的核心底层模块)是安装在 Python 3.5 环境里的,自然就会出现找不到模块的情况。
下面给你几个具体的解决步骤:
重新编译 mod_wsgi 适配 Python 3.5
这是最根本的解决方案。你需要先卸载现有不匹配的 mod_wsgi,再用 Python 3.5 的环境重新编译安装:- 先移除旧的 mod_wsgi 模块(命令根据服务器系统调整,以 Apache 为例):
sudo apt remove libapache2-mod-wsgi # Debian/Ubuntu 系统 # 若为源码安装,找到安装目录执行对应卸载脚本 - 用 Python 3.5 的 pip 安装适配版本的 mod_wsgi:
python3.5 -m pip install mod_wsgi - 按照安装完成后的提示,将 mod_wsgi 配置到 Apache 中(比如添加模块加载指令到 Apache 配置文件)。
- 先移除旧的 mod_wsgi 模块(命令根据服务器系统调整,以 Apache 为例):
确认 Pillow 安装在正确的 Python 环境
确保你的 Pillow 模块是安装在 Python 3.5 环境下,而非 Python 3.4:python3.5 -m pip install --upgrade pillow这一步能保证 _imaging 模块存在于当前应用使用的 Python 环境中。
检查 Apache 的 WSGIDaemonProcess 配置
如果使用 Apache + mod_wsgi 的 daemon 模式,一定要在配置里指定正确的 Python 路径,示例如下:WSGIDaemonProcess myapp python-path=/path/to/your/app/env/lib/python3.5/site-packages WSGIProcessGroup myapp这样能强制 mod_wsgi 使用 Python 3.5 的库路径,避免版本混淆。
另外,你可以先在命令行用 Python 3.5 运行 import PIL._imaging 测试一下,如果能正常导入,说明模块本身没问题,问题就完全出在 mod_wsgi 和 Python 版本不匹配上。
内容的提问来源于stack exchange,提问作者Davixxa

