近期在努力把本身的项目从python2转到python3上,由于生产环境没法抛弃centos7,因此只好在centos7上安装了python3。装好了python3,将python命令软链接改为python3的,同时也将pip指向了python3版本的pip。一切都很顺利,但在用uwsgi启动一个django的web服务时才发现出了问题:服务是启动了,可是一访问接口就返回500,再一看uwsgi这边的日志,显示:no python application found 。python
nginx+uwsgi+django的模式在以前屡次配过,都没有出现问题啊,为啥一到了python3的环境下就出问题了?个人环境应该配置得差很少了啊,并且全部的模块也都是在python3的环境下装的啊。nginx
再次检查了个人配置文件:web
[uwsgi] socket = 127.0.0.1:3031 chdir = /opt/testproj/ wsgi-file = testproj/wsgi.py processes = 4 threads = 2
感受也没有啥问题啊。因而又开始仔细查看uwsgi这边输出的日志,再往前看看,才看到了这么个报错:django
*** Operational MODE: preforking+threaded *** Traceback (most recent call last): File "testproj/wsgi.py", line 12, in <module> from django.core.wsgi import get_wsgi_application ModuleNotFoundError: No module named 'django' unable to load app 0 (mountpoint='') (callable not found or import error) *** no app loaded. going in full dynamic mode ***
没有找到django模块?原来成功启动只是一个假象,实际上如今uwsgi没找到django这个模块,一提供服务确定就500了。centos
可是为啥会没有找到django模块呢?uwsgi和django都是用python3的pip来装的啊,虽然这个centos7上还有python2,但也只是为了让yum还能正常使用而保留的啊。app
在网上一顿找,才发现,uwsgi还真是有点特殊,在python2和python3共存的系统上就会有点问题,此次启动时没法找到django模块是由于uwsgi命令使用python2的环境来进行了启动。须要在配置文件中指定所须要的库环境才能够。socket
因而开始找django的环境,使用pip show能够看到django安装的location:centos7
[root@knktc testproj]# pip show django|grep -i location Location: /usr/local/lib64/python3.6/site-packages
顺便把pytz的路径也找下:日志
[root@knktc testproj]# pip show pytz|grep -i location Location: /usr/local/lib/python3.6/site-packages
把这两个路径使用pythonpath参数加入到配置文件中,修改后的uwsgi配置文件是下面的这个样子的:code
[uwsgi] socket = 127.0.0.1:3031 chdir = /opt/testproj/ wsgi-file = testproj/wsgi.py processes = 4 threads = 2 pythonpath = /usr/local/lib64/python3.6/site-packages pythonpath = /usr/local/lib/python3.6/site-packages
再启动一次试试:
uwsgi --ini uwsgi.ini 一切正常!