Apache2部署Django时PIL模块导入失败问题求助
这问题我之前踩过坑!核心原因其实很直白:Apache的WSGI进程用的Python环境和你本地跑runserver时的环境不是同一个,PIL/Pillow只装在了你的本地开发环境里,Apache对应的环境找不到这个库,自然就报ImportError了。
下面是一步步的解决方案:
1. 先搞清楚Apache WSGI用的是哪个Python环境
首先得确认Apache到底在调用哪个版本的Python,以及它的模块搜索路径。你可以写个简单的测试WSGI脚本:
# test.wsgi import sys def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) output = f"Python 执行路径: {sys.executable}\n" output += "模块搜索路径:\n" + "\n".join(sys.path) return [output.encode()]
临时修改Apache配置,把WSGI脚本指向这个文件,重启Apache后访问对应的URL,或者直接看Apache的错误日志,就能拿到关键的路径信息了。
2. 给Apache的Python环境安装Pillow
注意:现在PIL已经停止维护了,官方推荐用它的分支Pillow,完全兼容PIL的API。找到刚才拿到的Python对应的pip工具,执行安装命令:
比如如果Apache用的是/usr/bin/python3,那对应的pip就是pip3,执行:
sudo /usr/bin/pip3 install pillow
这样就能把Pillow装到Apache能识别的环境里了。
3. 如果用了虚拟环境,一定要让WSGI激活它
如果你本地开发用了虚拟环境,那必须让Apache的WSGI进程也使用这个虚拟环境。打开你的Django项目里的wsgi.py,在开头加上这段代码(替换成你的虚拟环境实际路径):
activate_this = '/path/to/your/virtualenv/bin/activate_this.py' with open(activate_this) as file_: exec(file_.read(), dict(__file__=activate_this))
或者也可以在Apache的配置文件里设置WSGIPythonPath,直接指向虚拟环境的site-packages目录:
WSGIPythonPath /path/to/your/virtualenv/lib/python3.x/site-packages
修改完一定要重启Apache生效。
4. 检查权限问题(可选)
如果装了还是报错,可能是Apache的运行用户(通常是www-data)没有权限访问Pillow的安装目录。你可以用下面的命令检查权限:
ls -l /path/to/apache/python/site-packages/Pillow
如果www-data没有读权限,就修改权限:
sudo chmod -R 755 /path/to/apache/python/site-packages/Pillow
做完这些步骤,重启Apache,应该就能正常导入PIL/Image了!
内容的提问来源于stack exchange,提问作者이한준

