启动 uWSGI 时日志中显示 ImportError: No module named xxx 的解决方法
前几天在部署 Vue + Django + Uwsgi + Nginx 的生产环境时,发现前端部署成功了,但是一直无法获取后端的数据,检查 Uwsgi 日志(位于 uwsgi安装目录/projects/log 下)发现日志中提示 “ImportError: No module named xxx” ,试过网上的各种方法还是无法解决,最终摸索出一套解决方法如下:
1、首先使用 pip install xxx 安装缺失的 module 并重新运行 Uwsgi,如果日志中依然提示原来的错误,则转步骤 2 ;
pip install xxx(日志中提示缺失的模组名)
2、检查日志中启动 Uwsgi 时使用的 python 版本:
这里可知博主启动启动 Uwsgi 时使用的 python 版本是 3.6 ;
3、使用 pip3.6 list 命令查看当前版本下 python 库中所有的 module,若确实缺失 Uwsgi 中提示的 module,则使用 pip3.6 install xxx 即可(这两处 pip 后面的版本替换成自己日志中的 python 版本);
4、重新运行 Uwsgi,若 pip3.6 install 成功,Uwsgi 可正常运行,若提示别的模组缺失,则继续使用 pip3.6 install xxx 安装。
****** 其他问题 ******
Q:我不想使用日志中提示的 python 版本运行 Uwsgi,如何修改版本?
A:根据官方文档,可使用一个小的二进制文件,其中内建语言无关的特性,然后为每个Python版本准备一个插件,按需加载。
1、在uWSGI源代码目录中输入:
make PROFILE=nolang
2、在相同的目录下,构建 Python 插件:
PYTHON=python3.6 ./uwsgi --build-plugin "plugins/python python36" PYTHON=python2.7 ./uwsgi --build-plugin "plugins/python python27" PYTHON=python2.6 ./uwsgi --build-plugin "plugins/python python26"
拷贝上面的这些到想要的目录下 (默认情况下,uWSGI会在当前工作目录下搜索插件。)
3、在 Uwsgi 配置文件中添加:
plugins-dir = <path_to_your_plugin_directory> plugin = python36
其中 plugins-dir 是步骤2中所下载插件的路径,plugin 用于指定你想要使用的 python 版本。
4、使用 pkill -f uwsgi -9 关闭 Uwsgi 进程,再重启即可。
参考文档:
https://uwsgi-docs.readthedocs.io/en/latest/Install.html
https://uwsgi-docs-zh.readthedocs.io/zh-cn/latest/WSGIquickstart.html#pythonuwsgi