所以,我的CentOS机器上有两个不同版本的Python - 2.7和3.4。我想要的是简单地使用Python 3.4运行我的Django应用程序而不是旧的过时垃圾。为此,我创建了一个虚拟环境,以便我的文件夹结构现在看起来像这样
\vwrapper
\bin
\include
\lib
\lib64
...
我使用Python 3.4创建了这个虚拟环境。之后我像这样激活了这个环境:
$ source vwrapper/bin/activate
(vwrapper) [root@...]
所以,我清楚地看到,我现在在这个虚拟环境中。我现在甚至可以检查,确实我使用的是python 3.4:
(vwrapper) [root@...] # python --version
Python 3.4.5
在这个阶段一切都很好看。然后我安装了django:
(vwrapper) [root@...] # pip install django
再次没问题。在\ vwrapper \ bin中,我现在可以看到一些django工具。然后我使用其中一个工具来创建我的第一个django应用程序:
(vwrapper) [root@...] # bin/django-admin startproject accent
看起来不错。我去wsgi.py做了一点修改:
import os, sys
path = '/var/www/vwrapper/accent'
if path not in sys.path:
sys.path.append(path)
然后我去settings.py并进行一些修正:
ALLOWED_HOSTS = ['*']
大!唯一还有待完成的是apache虚拟主机。所以,我创建了这个虚拟主机并重新启动apache:
(vwrapper) [root@...] # apachectl restart
优秀!当我在浏览器中访问此主机时,我看到了我的第一个Django应用程序。到现在为止还挺好。但问题是,我看到使用旧的Python 2.7,我通过返回浏览器sys.version检查它:
def index(request):
return HttpResponse(sys.version)
这样,当我再次重新启动apache并转到此页面时,我在浏览器中看到此消息:
2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
到底是什么?我尝试通过添加
来解决它#!/usr/bin/python3.4
到每个.py脚本,但它没有帮助。我希望有人知道这可能有什么问题。我花了两天时间才能完成所有工作,但我仍然遇到了麻烦。我不知道我错过了什么。谢谢!
PS。这就是我的虚拟主机配置在Apache中的样子:
<VirtualHost *:8080>
ServerName django.localhost
WSGIScriptAlias / "/var/www/vwrapper/accent/accent/wsgi.py"
<Directory "/var/www/vwrapper/accent/accent">
Options +ExecCGI
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
所以,正如你所看到的,我没有在这个配置中提到Python,但可能我应该(但是,我不确切知道如何)。
修改
我对我的虚拟主机配置进行了一些更正,因此它看起来像:
WSGIPythonPath /var/www/vwrapper/accent:/var/www/vwrapper/lib/python3.4/site-packages
<VirtualHost *:8080>
ServerName django.localhost
WSGIScriptAlias / "/var/www/vwrapper/accent/accent/wsgi.py"
<Directory "/var/www/vwrapper/accent/accent">
Options +ExecCGI
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
我还编辑了我的wsgi.py脚本:
import site
site.addsitedir('/var/www/vwrapper/lib/python3.4/site-packages')
重启Apache,但无济于事。似乎我做了十几步使用Python 3.4,但仍然错过了一个秘密步骤。
答案 0 :(得分:2)
WSGIScriptAlias / "/var/www/vwrapper/accent/accent/wsgi.py"
您正在使用mod_wsgi来运行Python。您是否使用编译为使用Python 3的mod_wsgi?
例如,在Ubuntu上,存在使用Python 2的包libapache2-mod-wsgi
和使用Python 3的libapache2-mod-wsgi-py3
。但我不了解CentOS。
如果您可以自己编译mod-wsgi,请参阅https://modwsgi.readthedocs.io/en/develop/user-guides/installation-issues.html#multiple-python-versions。
答案 1 :(得分:0)
您必须确保您的Apache正在访问正确的virtualenv。 Activate仅适用于当前shell。很可能你的Apache有一个配置文件以某种方式将你的请求映射到你的应用程序。
答案 2 :(得分:0)
在两个Python版本的相同设置中,我正在使用wsgi.py,它正常工作。你在wsgy.py中激活了virtualenv吗?我认为问题来自这个文件。与你的比较。
import os, site, sys
# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('~/virtualenvs/projectenv/local/lib/python3.5/site-packages')
# Add the app's directory to the PYTHONPATH
sys.path.append('/home/ubuntu/project')
sys.path.append('/home/ubuntu/project/project')
# Assign settings module for starting
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'
# Activate your virtual env
activate_env=os.path.expanduser("/home/ubuntu/virtualenvs/projectenv/bin/activate_this.py")
exec(open(activate_env).read())
# Load environ variables
from prepare_server import prepare_server
prepare_server()
application = get_wsgi_application()