Подтвердить что ты не робот

Как запустить uwsgi с помощью virtualenv

В настоящее время я разрабатываю свой первый настоящий проект флагов python и собираюсь настроить сервер сборки для развертывания "Последней сборки", которая строится на каждой регистрации.

Я установил запуск script, где я запускаю приложение, используя uwsgi, и эта часть работает нормально. Недавно я также начал использовать virtualenv, и, таким образом, установленные пакеты добавлены в мой проект под projectname\flask\Lib\site-packages.

Я использую nginx в качестве веб-сервера, и конфигурация выглядит следующим образом:

location / { try_files $uri @graderbuild; }
location @graderbuild {
    include uwsgi_params;
    uwsgi_param UWSGI_CHDIR /usr/local/grader/build;
    uwsgi_param UWSGI_PYHOME /usr/local/grader/build;
    uwsgi_pass 127.0.0.1:3031;
}

Я начинаю uwsgi с помощью этого:

exec /usr/local/bin/uwsgi --master --socket 127.0.0.1:3031
    --wsgi-file restserver.py --callable app --processes 4 --die-on-term
    --threads 2 >> /var/log/grader-build.log 2>&1

Теперь, где я знаю, правильно ли я делаю это... в настоящее время я развертываю всю папку на сервере сборки. Я не хочу устанавливать глобальные модули python только для того, чтобы заставить мою сборку работать. Правильно или неправильно?

Ошибка, которую я получаю в настоящее время:

ImportError: No module named flask_wtf

Если я прав, как мне настроить настройку на использование пакетов virtualenv site-packages? Мое предпочтительное расположение было бы в startup script, а не в конфигурации nginx.

4b9b3361

Ответ 2

Чтобы использовать активированный virtualenv, вы можете использовать этот фрагмент конфигурации в вашем uwsgi.ini:

; If VIRTUAL_ENV is set then use its value to specify the virtualenv directory
if-env = VIRTUAL_ENV
virtualenv = %(_)
endif =

Ответ 3

Как user995394 указал, есть способ сказать, что uWSGI использует существующую виртуальную среду. Однако, когда я передаю опцию uWSGI в форме virtualenv = /full/path/to/my/virtualenv (она из конфигурации INI), она жалуется на ImportError: No module named site. Обходной путь, который я нашел, заключается в том, что вы запускаете uWSGI из папки, в которой находится ваш virtualenv, и передайте только virtualenv = my_virtualenv_name (т.е. Путь относительный).

Я использую uWSGI 2.0.

Ответ 4

У меня была эта проблема несколько месяцев назад, и у меня есть полный пример демо-конфигураций здесь, в том числе nginx, uwsgi, который запускается автоматически с выскочкой на linux.

fooobar.com/questions/227650/...

Ответ 5

Ответы других не помогли, и я добавил путь к virtualenv в файл конфигурации uwsgi.ini. Ошибка исчезла.

pythonpath = /path-to-virtualenv/project/lib/python2.7/site-packages

Ответ 6

Ответ бо решил эту проблему для меня.

Я так и не нашел хорошего объяснения директив UWSGI INI.

До ответа Бо я никогда не видел ответа на вопрос, какому explicitly должно быть установлено значение virtualenv - корень дерева питонов в venv, папка приложения в site-packages или корень VENV TREE. Что делать, если вы не используете venv, для чего вы устанавливаете дом, верхнюю часть дерева приложений, верхнюю часть папки python bin, папку python lib или dist-пакеты?

У меня есть это приложение, работающее в другой системе, так что на самом деле не должно быть так сложно запустить его в док-контейнере. Теперь, когда у меня все работает, я проверил эту рабочую установку и теперь вижу, что она указывает на вершину дерева venv. Я использовал virtualenvwrapper, так что это другой путь, чем при использовании только virtualenv.

Это заставляет меня задуматься, возможно ли запустить это приложение без venv. Поскольку это будет выполняться в док-контейнере, на самом деле нет веской причины использовать venvs, но, глядя на различия в структуре папок python, они сильно различаются между системным python и venv python.

Системный python3 разделен на отдельные папки, и файлы не все находятся под одной иерархией, как под venv. Если вы устанавливаете ваши пакеты с помощью pip, они окажутся в /usr/local/lib/python3/dist-packages, и в этом расположении НЕ будет папок site.py или encodings, поэтому многие из них имеют ошибки импорта.

После нескольких испытаний я обнаружил, что для запуска моего приложения без venv uwsgi ini НЕ должен определять ни домашние, ни virtualenv настройки. Если ваш системный путь включает в себя и /usr/bin И /usr/local/bin, он должен работать и найти все, даже если установленные пакеты pip идут куда-то еще с другой иерархией папок.