uwsgi + Flask + virtualenv ImportError: нет модуля с именем site

(Другие сообщения на SO аналогичны, но ни одна из них не имеет конкретной комбинации uwsgi + Flask + virtualenv) (этот ближайший)

Я установил uwsgi через apt-get. Я также попробовал pip install wsgi. Оба дали мне ту же проблему.

Команда тестирования:

sudo uwsgi -s /tmp/uwsgi.sock -w myapp:app -H myvirtualenv

Результат:

Python version: 2.7.4 (default, Apr 19, 2013, 18:35:44)  [GCC 4.7.3]
Set PythonHome to myvirtualenv
ImportError: No module named site

В противном случае я могу запустить приложение в виртуальном env.

Ответ 1

Сначала посмотрите ответ @JRajan.

Если вы уверены, что хотите просто устранить ошибку и фактически не решить основную проблему, вы должны добавить --no-site к вашей команде или no-site=true к вашему файлу uwsgi.ini.

Ответ 2

Неправильный путь к вашей виртуальной среде. Это средство для этой ошибки.

Я использую virtualenvwrapper, и мои виртуальные среды установлены в ~/.virtualenvs. Поэтому в моем случае вызов uwsgi будет выглядеть примерно так:

sudo uwsgi -s /tmp/uwsgi.sock -w myapp:app -H ~/.virtualenvs/myapp

Надеюсь, это поможет в следующий раз, когда кто-то найдет этот.

Спасибо Коди за указание на это в комментариях.

Ответ 3

В моем случае проблема была в версии python, которую пыталась использовать uWSGI.

Мой проект был написан на python 3.4, но я не указывал это в конфигурации uWSGI. Поэтому uWSGI попытался использовать python 2 и попытался импортировать модули из папки lib/python2.7 внутри virtualenv.

Поэтому я получил ошибку "Нет модуля с именем сайта", потому что все модули, включая модуль сайта, внутри lib/python3.4, а не lib/python2.7.

Чтобы решить эту проблему, мне пришлось сделать две вещи:

  • Установите плагин python3 для uWSGI, используя:
    apt-get install uwsgi-plugin-python3

  • Используйте его в конфигурационном файле.ini, используя:
    plugins = python34

Надеюсь, это поможет кому-то с той же проблемой в будущем.

В соответствии с запросом здесь следует мой.ini файл:

[uwsgi]
base = /your/app/path

pythonpath = %(base)
module = your_module_name

callable = app #Here you put the name of the variable which holds your app inside your module

home = /your/virtualenv/path
plugins = python34

master = true
processes = 2

uid = www-data
gid = www-data

socket = /path/to/socket
chmod-socket = 660

die-on-term = true

logto = /var/log/uwsgi/%n.log

Ответ 4

Раньше у меня была аналогичная проблема. Моя проблема в том, что у меня есть python2.x и python3.x в моей системе ubuntu, и я хочу, чтобы мой проект запускался в виртуальном env, в котором установлена среда python3. Как я решил эту проблему:

apt-get install python3-pip

pip3 установить uWSGI

Все это.

Ответ 5

Если ваша виртуальная среда работает на Python3, тогда вы должны установить uwsgi, используя pip3, а не pip иначе, несоответствие версии создаст эту проблему импорта

pip uninstall uwsgi    
pip3 install uwsgi

Ответ 6

ЭТО МОЖЕТ БЫТЬ ПЛОХО ДЛЯ БЕЗОПАСНОСТИ ДЛЯ НЕСКОЛЬКИХ ПРИЧИН. ЭТО РАБОТАЕТ ДЛЯ ТЕСТИРОВАНИЯ. НО ОБЗОР БЕЗОПАСНОСТИ ПЕРЕД ИСПОЛЬЗОВАНИЕМ ЭТОГО ТОЧНОГО РЕШЕНИЯ В ПРОИЗВОДСТВЕ

Другая причина, по которой может возникнуть эта ошибка, связана с разрешениями. Если вы используете файл.ini, как описано в официальном руководстве для uWSGI для django, возможно, вы создали файл ini с пользователем и группой, что делает файл недоступным для пользователя, выполняющего этот процесс.

Проверьте владельца и разрешения для файла и путь к каталогу. Используйте chown и chmod для установки необходимых разрешений.

sudo chown -R www-data:www-data/srv

sudo chmod 0775 -R/srv

В моем случае я использовал бродячую шкатулку для тестирования, а пользователь по умолчанию "бродячий", а nginx использует www-данные для пользователя и группы. Я установил владельца всех файлов в проекте пользователю и группе www-data и добавил бродячего пользователя в группу www-data.

sudo gpasswd -a vagrant www-data

Я не уверен, что это хорошая практика безопасности, поэтому я буду работать с моим системным администратором, когда придет время поставить его в производство. Но для моей тестовой среды это работает. В любом случае, разрешения будут рассмотрены по многим из этих вопросов.

Ответ 7

Я столкнулся с тем же, и моя проблема была связана с версией python, в которой запущен uwsgi. uwsgi работал на python2, но мой путь к python virtualenv был установлен на python3. Это создало конфликт, и он не смог найти установленный пакет сайта.

Дважды проверьте версию python, где запущен uwsgi, так что он совпадает с настройкой на вашем виртуальном сервере.

Ответ 8

У меня была эта проблема, когда мой homebrew обновил мою версию Python до Python 3.7, и она перестала работать. Для меня работал brew info python, который покажет вам все ваши доступные версии Python. Затем я откатился на Python 3.6.5, используя brew switch python 3.6.5.

После этого я просто переустановил свой uWSGI, используя:

pip3 uninstall uwsgi
pip3 install uwsgi

И это решило это. Если вы не уверены, какую версию Python вы использовали, brew info python покажет вам даты установки. Кроме того, вы можете проверить с pip3 list ли ваш uWSGI для текущей версии.

Надеюсь это поможет!