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