uWSGI搭配Python venv运行Django报错No module named 'django'
问题核心原因
报错本质是全局安装的uWSGI编译时绑定了系统Python3.5解释器,和你用Python3.7创建的fisrtsite虚拟环境二进制ABI不兼容,这种情况下就算加了-H参数指定虚拟环境路径,uWSGI也没法正常加载3.7环境下安装的Django包,和虚拟环境本身有没有装Django没有直接关系。
解决方法
- 方案1(最适配多项目管理需求,推荐)
不要用单个全局uWSGI适配所有项目,直接在对应Python版本的虚拟环境内安装匹配的uWSGI,从根源避免版本串扰:- 激活Python3.7创建的虚拟环境:
source /home/mo/fisrtsite/bin/activate - 在激活的虚拟环境内安装uWSGI,安装后的二进制会自动绑定当前环境的Python3.7解释器:
pip install uwsgi - 启动时直接调用虚拟环境内的uWSGI二进制即可,示例启动命令:
/home/mo/fisrtsite/bin/uwsgi --http :8080 --chdir /home/mo/sitefirst --home /home/mo/fisrtsite --module sitefirst.wsgi
- 激活Python3.7创建的虚拟环境:
- 方案2(坚持使用全局uWSGI的处理方式)
卸载原来绑定Python3.5的uWSGI,重新编译安装绑定Python3.7的全局版本:- 卸载原有全局uWSGI:
sudo -H pip3 uninstall uwsgi - 确认系统内Python3.7的路径,Ubuntu默认安装路径一般为
/usr/bin/python3.7,可以用which python3.7命令核验 - 调用Python3.7的pip重新全局安装uWSGI,安装过程会自动适配3.7版本的解释器:
sudo -H /usr/bin/python3.7 -m pip install uwsgi - 安装完成后执行
uwsgi --python-version,确认输出为3.7.x,再用原来的启动命令即可正常加载虚拟环境内的Django。
- 卸载原有全局uWSGI:
排查提醒:注意你记录的虚拟环境名拼写为
fisrtsite(存在字母顺序笔误),启动前先执行ls /home/mo/fisrtsite/bin/activate确认虚拟环境路径真实存在,路径拼写错误也会导致虚拟环境加载失败。
内容的提问来源于stack exchange,提问作者Mohi
相关产品推荐
相关产品推荐

