0

Как запустить uWSGI с использованием virtualenv?

14

Я сейчас разрабатываю свой первый полноценный проект на Python с использованием Flask и собираюсь настроить сервер сборки для развертывания "Последней сборки", которая создаётся при каждом коммите.

Я настроил скрипт запуска, где запускаю приложение с помощью 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

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

5 ответ(ов)

0

Чтобы установить виртуальное окружение для uWSGI, используйте параметр -H, указывая путь к вашему виртуальному окружению. Например:

uwsgi -H /path/to/your/virtualenv

Это позволит uWSGI использовать интерпретатор Python и зависимости из заданного виртуального окружения. Для получения дополнительной информации вы можете обратиться к документации uWSGI.

0

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

; Если VIRTUAL_ENV установлена, используйте ее значение для указания директории виртуального окружения
if-env = VIRTUAL_ENV
virtualenv = %(_)
endif =

Этот код проверяет наличие переменной окружения VIRTUAL_ENV, и если она установлена, использует ее значение для указания директории вашего виртуального окружения.

0

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

pythonpath = /путь-к-виртуальному-окружению/project/lib/python2.7/site-packages

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

0

У меня была такая проблема несколько месяцев назад, и я подготовил полный пример демонстрационных конфигураций, включая настройки для nginx и автоматический запуск uwsgi с помощью upstart на Linux. Вы можете ознакомиться с ними по следующей ссылке: https://stackoverflow.com/a/27221427/567606.

0

Ответ Бро сделал это возможным для меня.

Я так и не нашёл хорошего объяснения директивам ini файла uwsgi.

До ответа Бро я никогда не видел прямого объяснения, что именно должно быть задано для значения virtualenv — корень деревьев Python в venv, папка приложения в site-packages или корень дерева VENV. А что если вы не используете venv, что тогда следует установить для home: верхнюю часть дерева приложения, верхнюю часть папки bin Python, папку библиотек Python или dist-packages?

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

Мне интересно, возможно ли запустить это приложение без venv. Поскольку оно будет работать в контейнере Docker, на самом деле нет хорошей причины использовать venv, но, взглянув на отличия в структуре папок Python, я вижу, что они довольно различаются между системным Python и Python в venv.

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

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь