Top.Mail.Ru

Python venv: виртуальное окружение на Linux — полный гайд

21
Python venv: виртуальное окружение на Linux — полный гайд

Виртуальное окружение Python создаётся командой python3 -m venv venv и активируется через source venv/bin/activate. После активации pip install устанавливает пакеты только в это окружение, не затрагивая системный Python и другие проекты. venv встроен в Python 3.3+ — устанавливать ничего дополнительно не нужно.

Зачем нужно виртуальное окружение

Представьте: проект А требует Django 3.2, проект Б — Django 4.2. Если устанавливать пакеты глобально через pip install, второй проект перезапишет зависимости первого, и один из них сломается.

Виртуальное окружение изолирует зависимости каждого проекта в отдельную папку. Проект А видит только свои пакеты, проект Б — свои. Конфликтов нет.

На сервере это ещё важнее: глобальная установка пакетов через pip может сломать системные утилиты которые зависят от Python. Некоторые дистрибутивы даже блокируют глобальную установку через pip — именно поэтому pip install без venv выдаёт ошибку externally-managed-environment на Ubuntu 23.04 и новее.

Установка python3-venv

На большинстве систем venv доступен сразу. Если получаете ошибку No module named venv:

sudo apt install python3-venv python3-pip -y

Создание виртуального окружения

Перейдите в папку проекта и создайте окружение:

cd ~/myproject
python3 -m venv venv

Папка venv создастся внутри проекта. Внутри неё — изолированная копия Python интерпретатора и пустой site-packages для зависимостей.

Альтернативное название .venv (с точкой в начале) — скрытая директория, современное соглашение в Python-сообществе:

python3 -m venv .venv

Выбор между venv и .venv — вопрос предпочтений. Главное: оба варианта нужно добавить в .gitignore.

Активация и деактивация

Активируйте окружение:

source venv/bin/activate

После активации в начале приглашения командной строки появится имя окружения:

(venv) user@server:~/myproject$

Это визуальный сигнал что окружение активно. Теперь python и pip указывают на версии внутри venv, а не системные.

Проверить:

which python
# → /home/user/myproject/venv/bin/python

Деактивировать когда работа закончена:

deactivate

Работа с пакетами внутри окружения

Установить пакет:

pip install requests flask

Обновить pip до актуальной версии (pip внутри нового venv часто устаревший):

pip install --upgrade pip

Посмотреть установленные пакеты:

pip list

requirements.txt: сохранение и восстановление зависимостей

requirements.txt — стандартный способ зафиксировать точные версии всех зависимостей проекта.

Важный нюанс: для создания requirements.txt нужна команда pip freeze, а не pip list:

pip freeze > requirements.txt

Разница принципиальная. pip list выводит читаемый список без форматирования, непригодный для автоматической установки. pip freeze выводит строки вида requests==2.31.0 — именно такой формат понимает pip install -r.

Посмотреть содержимое файла:

cat requirements.txt

Установить зависимости из файла — например, при развёртывании проекта на новом сервере или после клонирования репозитория:

pip install -r requirements.txt

Никогда не коммитьте venv в git

Папка venv весит 50-300 МБ в зависимости от установленных пакетов. Она содержит бинарники скомпилированные под конкретную ОС — они не работают на другой системе. И она полностью воссоздаётся из requirements.txt за одну команду.

Добавьте в .gitignore:

echo "venv/" >> .gitignore
echo ".venv/" >> .gitignore

Или создайте .gitignore с содержимым:

venv/
.venv/
__pycache__/
*.pyc
*.pyo
.env

Как проверить что окружение активно

Три способа убедиться:

echo $VIRTUAL_ENV

Выведет путь к venv если активен, пустую строку если нет.

which python

Должен указывать на venv/bin/python, не на /usr/bin/python3.

python -c "import sys; print(sys.prefix)"

Выведет путь к директории venv.

Venv в cron-задачах

Это критичный момент для работы на VPS. Когда cron запускает скрипт, виртуальное окружение не активировано — команда python script.py будет использовать системный Python без нужных зависимостей и упадёт с ModuleNotFoundError.

Неправильно:

0 3 * * * cd /home/user/myproject && python script.py

Правильно — использовать полный путь к Python внутри venv:

0 3 * * * /home/user/myproject/venv/bin/python /home/user/myproject/script.py

Не пытайтесь активировать venv через source в cron — cron запускает задачи в неинтерактивной оболочке где source работает непредсказуемо.

Venv в systemd-сервисе

Аналогичная история при запуске Python-приложения как systemd-сервиса:

[Unit]
Description=My Python App
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/myproject
ExecStart=/home/ubuntu/myproject/venv/bin/python app.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

Ключевая строка: ExecStart указывает на Python внутри venv. Systemd не наследует переменные окружения пользователя, активация через source здесь тоже не работает.

Пересоздание окружения

Если нужно начать с чистого листа:

deactivate
rm -rf venv
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

Для обновления версии Python в существующем venv:

python3 -m venv venv --upgrade

Сравнение инструментов для изоляции Python

Инструмент Встроен Когда использовать
venv Да (Python 3.3+) Большинство проектов, стандартный выбор
virtualenv Нет Нужна поддержка Python 2 или более быстрое создание
conda Нет Data science, нужны не-Python зависимости (numpy с CUDA)
pipenv Нет Хотите Pipfile вместо requirements.txt
poetry Нет Разработка пакетов, нужен lock-файл и публикация на PyPI

Для типичных веб-приложений и скриптов на VPS — venv оптимальный выбор: встроен, прост, понятен.

Быстрая шпаргалка

# Создать
python3 -m venv venv

# Активировать
source venv/bin/activate

# Установить зависимости
pip install -r requirements.txt

# Добавить новую зависимость
pip install название-пакета

# Сохранить зависимости
pip freeze > requirements.txt

# Деактивировать
deactivate

# В cron/systemd — полный путь
/path/to/project/venv/bin/python script.py

Часто задаваемые вопросы

Нужно ли устанавливать venv отдельно?

Нет, venv встроен в Python начиная с версии 3.3. На Ubuntu может потребоваться sudo apt install python3-venv — это пакет который делает модуль доступным, но сам venv является частью стандартной библиотеки Python.

В чём разница между pip freeze и pip list?

pip list выводит читаемую таблицу пакетов — удобно для просмотра. pip freeze выводит строки формата пакет==версия — именно этот формат понимает pip install -r. Для создания requirements.txt всегда используйте pip freeze.

Почему Python-скрипт не находит пакеты в cron?

Потому что cron не активирует виртуальное окружение автоматически. Используйте полный путь к Python внутри venv: /path/to/project/venv/bin/python script.py вместо просто python script.py.

Можно ли использовать одно venv для нескольких проектов?

Технически да, но это плохая практика. Разные проекты могут требовать разные версии одних и тех же пакетов, и общее окружение в какой-то момент сломается. Создавайте отдельный venv для каждого проекта.

Что делать с ошибкой externally-managed-environment?

Эта ошибка появляется в Ubuntu 23.04 и новее при попытке pip install без активированного venv. Система защищает от загрязнения системного Python. Решение: создайте venv и устанавливайте пакеты внутри него — именно так и должно быть.

Python-приложения на VPS удобнее запускать с изолированными зависимостями через venv — это исключает конфликты пакетов и упрощает деплой.
На UFO.Hosting серверы с Ubuntu 22.04 и 24.04 разворачиваются за минуты: Python 3 и pip доступны сразу после подключения.

Похожее

Все статьи
Fail2ban

Fail2ban: защита VPS от брутфорса на Ubuntu

Fail2ban следит за логами сервера и временно блокирует IP-адреса, с которых идут неудачные попытки входа. Установка занимает одну команду, базовая защита SSH работает сразу после запуска без дополнительной настройки. Если в логах auth.log вы видите сотни попыток входа с разных…

nginx установка на ubuntu

Nginx: установка и настройка на Ubuntu 22.04 и 24.04

Nginx устанавливается на Ubuntu одной командой и начинает работать сразу после этого. Весь процесс — от чистого сервера до работающего сайта — занимает около десяти минут. Ниже разберём установку, настройку файрвола, создание виртуального хоста и основные команды для повседневной работы.…