Python venv
Общая информация о виртуальных средах
Помимо глобальной установки зависимостей для модулей, написанных на Python, также можно использовать локальную (виртуальную) среду, которая будет содержать весь необходимый набор модулей и без проблем может поддаваться бесконфликтным изменениям (обновлению, переустановке, удалению и т.д.).
Виртуальная среда - это специальный подкаталог внутри каталога с модулем (обычно именуемый venv), который включает в себя все необходимые средства для запуска модуля: интерпретатор python
необходимой версии, служебные пакеты pip
и setuptools
, пакеты, от которых зависит модуль и другие инструменты. Чтобы запустить модуль userside с использованием виртуальной среды, нужно всего лишь вызвать интерпретатор python, расположенный в этой виртуальной среде. Это автоматически вызовет подключение всех пакетов из виртуальной среды (подкаталога venv).
На сегодняшний день существует несколько модулей python, предназначенных для создания виртуальной среды. Самые распространенные из них: классический virtualenv и появившийся в Pyhon3 встроенный стандартный модуль venv. Стоит, однако, обратить внимание на то, что в Debian (Ubuntu и т.д.) стандартный модуль venv вынесен в отдельный пакет python3-venv
, который нужно установить отдельно: sudo apt-get install python3-venv
.
Создание виртуальной среды для проекта с использованием venv
Далее в примере будет рассмотрено использование стандартного модуля venv.
Предположим, модуль userside, для которого необходимо настроить виртуальную среду, находится в каталоге /opt/usm_checker. Для начала нужно установить все необходимые системные зависимости модуля. Для usm_checker это пакет python3-dev, без которого невозможна дальнейшая сборка зависимостей.
Перейдите в каталог с модулем userside и выполните команду инициализации виртуального окружения в подкаталоге venv.
cd /opt/usm_checker python3 -m venv venv ./venv/bin/pip install --upgrade pip setuptools
Теперь необходимо установить зависимости. Однако, нам нужно использовать менеджер пакетов из виртуальной среды, а не глобальный, чтобы установить зависимости в виртуальную среду.
./venv/bin/pip install --upgrade -r requirements.txt
Продолжайте далее следовать инструкции по установке и настройке модуля userside. Выполняйте все действия с поправкой на то, что вы теперь должны использовать интерпретатор из виртуальной среды. Пример использования pip из виртуальной среды был показал выше.
Итак, вместо запуска модуля командой sudo python3 usm_checker.py
вам нужно использовать команду:
sudo ./venv/bin/python usm_checker.py
Ну а в cron придется прописать абсолютный путь к интерпретатору и скрипту. По аналогии с примером из документации usm_checker это будет выглядеть так:
*/2 * * * * root /opt/usm_checker/venv/bin/python /opt/usm_checker/usm_checker.py > /dev/null 2>&1
Использование virtualenv
Если вы желаете использовать virtualenv вместо venv, то его необходимо установить и затем проинициализировать окружение. Обновлять базовые модули pip и setuptools не нужно, так как во время создания виртуальной среды устанавливаются их последние версии. Все остальные команды идентичны venv.
sudo pip3 install --update virtualenv cd /opt/usm_checker python3 -m virtualenv -p /usr/bin/python3.7 venv ./venv/bin/pip install --upgrade -r requirements.txt
И т.д.
Дополнительная информация
Так как виртуальная среда соответствует одной конкретной версии python, то нет смысла указывать явно интерпретатор python3 или python3.7, хоть это и не будет ошибкой. Виртуальная среда содержит три символические ссылки с именами python, python3, python3.7, которые ссылаются на один и тот же исполняемый файл. Тоже самое касается модуля pip - он также имеет три абсолютно одинаковых исполняемых файла pip, pip3, pip3.7.