Python 2.7 Virtualenv Path Path в OSX 10.5 - PullRequest
       7

Python 2.7 Virtualenv Path Path в OSX 10.5

1 голос
/ 11 октября 2011

Описание проблемы

Проблемы, возникающие при попытке загрузить веб-сайт Django, использующий mod_wsgi, python 2.7 и virtualenv, это то, что я получаю ошибку 500, когда захожу на сайт в своем браузере. когда Я смотрю на ошибку, созданную в моем журнале Apache, я получаю следующее ...

[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226] mod_wsgi (pid=69270): Exception occurred processing WSGI script '/Volumes/Ontario/Sites/emails/config/apache/dev.emails.wenatcheeworld.com.wsgi'.
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226] Traceback (most recent call last):
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226]   File "/Library/Python/2.5/site-packages/Django-1.2.1-py2.5.egg/django/core/handlers/wsgi.py", line 230, in __call__
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226]     self.load_middleware()
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226]   File "/Library/Python/2.5/site-packages/Django-1.2.1-py2.5.egg/django/core/handlers/base.py", line 33, in load_middleware
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226]     for middleware_path in settings.MIDDLEWARE_CLASSES:
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226]   File "/Library/Python/2.5/site-packages/Django-1.2.1-py2.5.egg/django/utils/functional.py", line 276, in __getattr__
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226]     self._setup()
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226]   File "/Library/Python/2.5/site-packages/Django-1.2.1-py2.5.egg/django/conf/__init__.py", line 40, in _setup
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226]     self._wrapped = Settings(settings_module)
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226]   File "/Library/Python/2.5/site-packages/Django-1.2.1-py2.5.egg/django/conf/__init__.py", line 75, in __init__
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226]     raise ImportError("Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e))
[Tue Oct 11 09:32:30 2011] [error] [client 206.130.131.226] ImportError: Could not import settings 'config.settings' (Is it on sys.path? Does it have syntax errors?): No module named config.settings

Трассировка не имеет смысла, поскольку загружаемые файлы взяты из глобальной библиотеки python 2.5.

Информация о настройке Virtualenv

Я установил python 2.7 на OS X Server, который работает под управлением OS X 10.5.8. я установленный Python с использованием Python 2.7.2 Mac OS X 32-битный установщик i386 / PPC . На сервере в настоящее время установлен virtualenv 1.6.4.

Я настроил использование virtualenv для нового веб-сайта, используя следующее

$ cd /usr/local/virtualenvs
$ virtualenv --no-site-packages -p /usr/local/bin/python2.7 dev.emails

Затем я устанавливаю все необходимые пакеты python. Когда я запускаю pip freeze, это мой вывод

$ pip freeze
Django==1.3
PIL==1.1.7
South==0.7.3
amqplib==1.0.2
anyjson==0.3.1
boto==2.0
celery==2.2.7
django-celery==2.2.4
django-compressor==0.9.2
django-grappelli==2.3.4
django-picklefield==0.1.9
feedparser==5.0.1
html2text==3.02
kombu==1.4.1
lxml==2.2.2
psycopg2==2.4.2
pyparsing==1.5.6
python-dateutil==1.5
python-sendgrid==0.2.0dev
redis==2.4.9
requests==0.6.2
wsgiref==0.1.2

Действия по устранению неисправностей

Я создал скрипт под названием path_test.py, чтобы проверить мой путь к virtualenv ...

import os
import sys

# Activate Python Virtual Enviroment
activate_this = '/usr/local/virtualenvs/dev.emails/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

# start django
import django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings'

for p in sys.path:
        print p

application = django.core.handlers.wsgi.WSGIHandler()

Когда я запускаю скрипт, используя python path_test.py, я получаю следующий вывод:

/usr/local/virtualenvs/dev.emails/lib/python2.5/site-packages
/Volumes/Ontario/Sites/emails/bin
/Library/Python/2.5/site-packages/MySQL_python-1.2.2-py2.5-macosx-10.5-i386.egg
/Library/Python/2.5/site-packages/paramiko-1.7.4-py2.5.egg
/Library/Python/2.5/site-packages/simplejson-2.0.7-py2.5-macosx-10.5-i386.egg
/Library/Python/2.5/site-packages/python_ldap-2.3.7-py2.5-macosx-10.5-i386.egg
/Library/Python/2.5/site-packages/lxml-2.2.2-py2.5-macosx-10.5-i386.egg
/Library/Python/2.5/site-packages/pytz-2010h-py2.5.egg
/Library/Python/2.5/site-packages/python_openid-2.2.4-py2.5.egg
/Library/Python/2.5/site-packages/Markdown-2.0.3-py2.5.egg
/Library/Python/2.5/site-packages/django_authopenid-1.0.1-py2.5.egg
/Library/Python/2.5/site-packages/Django-1.2.1-py2.5.egg
/Library/Python/2.5/site-packages/django_profiles-0.2-py2.5.egg
/Library/Python/2.5/site-packages/django_openid_consumer-0.1.1-py2.5.egg
/Library/Python/2.5/site-packages/setuptools-0.6c11-py2.5.egg
/Library/Python/2.5/site-packages/ipython-0.10-py2.5.egg
/Library/Python/2.5/site-packages/httplib2-0.6.0-py2.5.egg
/Library/Python/2.5/site-packages/guess_language-0.2-py2.5.egg
/Library/Python/2.5/site-packages/django_ratings-0.3.4-py2.5.egg
/Library/Python/2.5/site-packages/pip-0.8.1-py2.5.egg
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python25.zip
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-darwin
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-mac
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/plat-mac/lib-scriptpackages
/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload
/Library/Python/2.5/site-packages
/Library/Python/2.5/site-packages/PIL
/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/PyObjC

Если я сначала активирую virtualenv, используя source /path/to/virtualenv/bin/activate, а затем запускаю python path_test.py, я получаю следующий вывод:

/usr/local/virtualenvs/dev.emails/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
/usr/local/virtualenvs/dev.emails/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg
/usr/local/virtualenvs/dev.emails/lib/python2.7/site-packages/lxml-2.2.2-py2.7-macosx-10.3-intel.egg
/usr/local/virtualenvs/dev.emails/lib/python2.7/site-packages
/usr/local/virtualenvs/dev.emails/lib/python2.7/site-packages/PIL
/Volumes/Ontario/Sites/emails/bin
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/site-packages/pip-1.0.2-py2.7.egg
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/site-packages/lxml-2.2.2-py2.7-macosx-10.3-intel.egg
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python27.zip
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/plat-darwin
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/plat-mac
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/plat-mac/lib-scriptpackages
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/lib-tk
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/lib-old
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/lib-dynload
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/site-packages
/Volumes/Ontario/local/virtualenvs/dev.emails/lib/python2.7/site-packages/PIL
/Volumes/Ontario/Sites/emails

На данный момент я почти уверен, что проблема в том, что activate_this.py в virtualenv не устанавливает правильную sys.path.

Ответы [ 4 ]

2 голосов
/ 12 октября 2011

Как я указывал в своем ответе на мой собственный вопрос и, как уже отвечали другие, невозможно использовать другую версию python с mod_wsgi.Моим решением было установить и настроить gunicorn для моего конкретного сайта, для которого требовалась другая версия python.

Сначала я установил gunicorn ...

$ /usr/local/virtualenvs/my.examplesite/bin/activate
$ pip install gunicorn

Затем я настроил файл launchd.plist длязапустите gunicorn в /Library/LaunchDaemons/my.examplesite.com.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key><string>my.examplesite.com</string>
        <key>EnvironmentVariables</key>
        <dict>
            <key>DJANGO_SETTINGS_MODULE</key><string>config.settings</string>
        </dict>
        <key>UserName</key><string>_www</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/virtualenvs/my.examplesite/bin/gunicorn_django</string>
            <string>--bind=127.0.0.1:8001</string>
        </array>
        <key>RunAtLoad</key><true/>
        <key>StandardErrorPath</key><string>/var/log/gunicorn/my.examplesite.com.error.log</string>
        <key>StandardOutPath</key><string>/var/log/gunicorn/my.examplesite.com.access.log</string>
    </dict>
</plist>

Далее я устанавливаю nginx на серверный носитель и прокси на мой сервер gunicorn:

server {

    listen       80;
    server_name  my.examplesite.com;
    access_log   /var/log/nginx/my.examplesite.com.access.log;
    error_log    /var/log/nginx/my.examplesite.com.error.log;

    location = /favicon.ico {
        return  404;
    }

    location  /static/ {
        root  /path/to/site/root/;
    }

    location  /media/ {
        root  /path/to/site/root/;
    }

    location  / {
        proxy_pass            http://127.0.0.1:8001/;
        proxy_redirect        off;
        proxy_set_header      Host             $host;
        proxy_set_header      X-Real-IP        $remote_addr;
        proxy_set_header      X-Forwarded-For  $proxy_add_x_forwarded_for;
        client_max_body_size  10m;
    }

}
1 голос
/ 12 октября 2011

У вас есть пара проблем.

Во-первых, activ_this.py работает нормально. Проблема в вашей настройке. Вы пытаетесь активировать virtualenv, но вы используете системный по умолчанию 2.5 Python, а не Virtualenv 2.7 Python. Именно поэтому вы видите системные пакеты сайта; '--no-site-packages "применяется только к двоичному файлу python, созданному virtualenv. Именно поэтому он добавляет" /usr/local/virtualenvs/dev.emails/lib/python2.5/site-packages ". Сценарий activ_this.py использует версию python, выполняющую скрипт, чтобы определить каталог site-packages для использования:

site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')

Когда вы активируете virtualenv, он использует правильный двоичный файл 2.7.

Во-вторых, ваша версия mod_wsgi была построена для системного Python 2.5, поэтому она сталкивается с той же проблемой, которую вы видите, когда virtualenv не активирован. Сценарий «activ_this.py» на самом деле ничего не делает для принудительного применения опции «--no-site-packages», он опирается на двоичный файл python, созданный virtualenv, поэтому mod_wsgi никогда не будет применять «--no-site-packages». Вот почему вы видите, что он возвращается к версии Django, установленной в системе, когда он не находит директорию 2.5 site-packages в virtualenv.

В-третьих, Apache работает в 64-битном режиме на 10.5, и вы установили двоичный файл python, который является 32-битным, поэтому даже если вы перестроили mod_wsgi для вашей версии 2.7, Apache потерпит крах при попытке загрузить его. И, конечно, все ваши 2,5 сайта будут иметь ту же проблему, что и ваши 2,7 сейчас. Лучше всего, чтобы ваши 2,7 сайта работали за чем-то вроде gunicorn.

0 голосов
/ 12 октября 2011

Если вы создали mod_wsgi из исходного кода для Python 2.7, но обнаружили, что он собирает инфраструктуру Python 2.5 (и по какой-то причине не падает), попробуйте использовать:

--disable-framework

для настройки при сборке mod_wsgi из исходного кода на Python 2.7.

Если вы даже не пересобрали mod_wsgi для Python 2.7, сделайте это сначала.

0 голосов
/ 11 октября 2011

Похоже, что mod_wsgi по умолчанию установлен на Python 2.5.Вы правильно его скомпилировали?Взгляните на http://code.google.com/p/modwsgi/wiki/InstallationIssues#Multiple%5FPython%5FVersions.

со страницы virtualenv и mod_wsgi [1]:

Обратите внимание, что версия Python, из которой создается эта базовая среда, должна быть одинаковойверсия Python, для которой был скомпилирован mod_wsgi.Невозможно смешивать среды на основе разных основных / второстепенных версий Python.

[1] http://code.google.com/p/modwsgi/wiki/VirtualEnvironments

...