UWSGI + virtualenv 'Нет модуля с именем site'
Таким образом, это похоже на действительно общую проблему с этой настройкой, но я не могу найти решения, которые работают на SO. Я установил очень новый сервер Ubuntu 15.04, затем установил nginx, virtualenv (и -wrapper) и uWSGI (через apt-get, так глобально, а не внутри virtualenv).
Мой virtualenv находится в /root/Env/example
. Внутри virtualenv я установил Django, а затем в /srv/www/example/app запускал команду Django startproject
с именем проекта example
, поэтому я смутно отношусь к этой структуре:
-root
-Env
-example
-bin
-lib
-srv
-www
-example
-app
-example
manage.py
-example
wsgi.py
...
Мой файл example.ini для uWSGI выглядит следующим образом:
[uwsgi]
project = example
plugin = python
chdir = /srv/www/example/app/example
home = /root/Env/example
module = example.wsgi:application
master = true
processes = 5
socket = /run/uwsgi/app/example/example.socket
chmod-socket = 664
uid = www-data
gid = www-data
vacuum = true
Но независимо от того, запускаю ли я это через uwsgi --ini /etc/uwsgi/apps-enabled/example.ini
или через демона, я получаю ту же ошибку:
Python version: 2.7.9 (default, Apr 2 2015, 15:37:21) [GCC 4.9.2]
Set PythonHome to /root/Env/example
ImportError: No module named site
Я должен отметить, что проект Django работает через встроенный сервер разработки ./manage.py runserver
, и когда я удаляю home = /root/Env/example
, работа работает (но, очевидно, использует глобальные версии Python и Django, а не версии virtualenv, которые означает, что это бесполезно для правильной настройки virtualenv).
Может ли кто-нибудь увидеть очевидную ошибку пути, которую я не вижу? Насколько я могу судить, home
полностью корректен на основе моей структуры каталогов и всего остального в ini, так почему же он не работает с этим ImportError?
Ответы
Ответ 1
В моем случае я видел эту проблему, потому что приложение django, которое я пытался запустить, было написано на python 3, тогда как uwsgi был настроен для python 2. Я исправил проблему:
- перекомпиляция uwsgi для поддержки приложений python 2 и python 3
(Я следил за этот руководство)
- добавив это в mydjangoproject_uwsgi.ini:
plugins = python35 # or whatever you specified while compiling uwsgi
Для других людей, использующих Django, вы также должны убедиться, что правильно указали следующее:
# Django dir that contains manage.py
chdir = /var/www/project/myprojectname
# Django wsgi (myprojectname is the name of your top-level project)
module = myprojectname.wsgi:application
# the virtualenv you are using (full path)
home = /home/ubuntu/Env/mydjangovenv
plugins = python35
Ответ 2
Как сказал @Freek, сайт ссылается на модуль python.
Ошибка утверждает, что python не может найти этот пакет, потому что вы указали python_home в неправильном месте.
Я столкнулся с той же проблемой, и мой uwsgi.ini выглядит следующим образом:
[uwsgi]
# variable
base = /home/xx/
# project settings
chdir = %(base)/
module = botservice.uwsgi:application
home = %(base)/env/bin
Для этой конфигурации uwsgi может найти исполняемый файл python в /env/bin, но в этой папке не обнаружено пакетов. Поэтому я перешел домой на
home = %(base)/env/
и это сработало для меня.
В вашем случае я предлагаю перекопать в директиву home
и указать ее в место, содержащее как исполняемые файлы python, так и пакеты.
Ответ 3
Модуль site
находится в корне django.
Первая проверка - активировать virtualenv вручную (source /root/Env/example/bin/activate
, запустить python и import site
). Если это не удается, попробуйте установить django.
Предполагая, что django правильно установлен в virtualenv, убедитесь, что uWSGI активирует virtualenv. Соответствующие директивы конфигурации uWSGI:
plugins = python
virtualenv = /root/Env/example
и если у вас есть импорт ошибок example.wsgi
:
pythonpath = /srv/www/example/app/example