Итак, у меня есть две разные версии Python на моей машине CentOS - 2.7 и 3.4. Я хочу просто запустить приложение Django, используя Python 3.4, а не этот старый устаревший мусор. Для этого я создал виртуальную среду, поэтому структура папок теперь выглядит следующим образом

\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, но все еще пропускаю один секретный шаг.

2
Jacobian 13 Дек 2016 в 11:24

3 ответа

Лучший ответ
WSGIScriptAlias / "/var/www/vwrapper/accent/accent/wsgi.py"

Вы используете mod_wsgi для запуска вашего Python. Используете ли вы mod_wsgi, который скомпилирован для использования Python 3?

Например, в Ubuntu существуют пакеты libapache2-mod-wsgi, которые используют Python 2, и libapache2-mod-wsgi-py3, которые используют Python 3. Но я не знаю о CentOS.

Если вы можете скомпилировать mod-wsgi самостоятельно, см. https://modwsgi.readthedocs.io/en/develop/user-guides/installation-issues.html#multiple-python-versions .

2
RemcoGerlich 13 Дек 2016 в 09:35

Вы должны убедиться, что ваш Apache имеет доступ к правильному virtualenv. Активировать работает только для текущей оболочки. Скорее всего, ваш Apache имеет конфигурационный файл, каким-то образом отображающий ваш запрос в ваше приложение.

0
frlan 13 Дек 2016 в 08:28

В той же настройке с двумя версиями Python я использую следующий wsgi.py, который работает правильно. Вы активировали virtualenv внутри wsgy.py? Я думаю, что проблема идет из этого файла. Сравните это с вашим.

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()
0
Alexander Tyapkov 13 Дек 2016 в 09:29