Локальные виртуальные среды Python: настройка и использование
Основные подходы к изоляции Python-окружений
Как создать изолированное окружение без установки дополнительных инструментов?
Встроенный модуль venv позволяет создать изолированную среду для любого проекта. Это наиболее простой и рекомендуемый способ для стандартных задач.
# Создание окружения с именем myenv
python -m venv myenv
# Активация в Linux/macOS
source myenv/bin/activate
# Активация в Windows (PowerShell)
myenv\Scripts\Activate.ps1
# Установка пакета внутри окружения
pip install requests
# Деактивация
deactivate
Python local (локальное окружение python)
После активации все команды python и pip указывают на локальное окружение. Окружение наследует версию Python, которая вызвала команду создания.
Проблема: на Windows при запуске скрипта активации может возникнуть ошибка выполнения сценариев из-за политики ExecutionPolicy.
Решение: разрешить выполнение скриптов только для текущей сессии:
Set-ExecutionPolicy Unrestricted -Scope Process
Или использовать командную строку (cmd) с файлом myenv\Scripts\activate.bat.
Проблема: если команда python не найдена, нужно указать полный путь к интерпретатору.
Решение: использовать путь, например C:\Python39\python -m venv myenv.
Цель использования: базовая изоляция зависимостей для небольших проектов, когда не требуется сложное управление версиями Python.
Как получить больше возможностей, чем встроенный venv?
Инструмент virtualenv (ранее standalone) предоставляет дополнительные опции: поддержку разных версий Python через флаг -p, более быструю работу и совместимость со старыми версиями Python (2.x).
# Установка virtualenv
pip install virtualenv
# Создание окружения с указанием версии Python
virtualenv -p /usr/bin/python3.10 myenv
# Активация и деактивация аналогично venv
source myenv/bin/activate
deactivate
Проблема: если указать несуществующий путь к интерпретатору, virtualenv выдаст ошибку.
Решение: предварительно проверить доступные версии командой which python3.10 или where python.
Случаи использования: проекты, требующие конкретной версии Python, или унаследованные кодовые базы.
Как управлять зависимостями и окружением в одном файле?
Pipenv объединяет управление пакетами и виртуальными окружениями через файлы Pipfile и Pipfile.lock. Он автоматически создаёт окружение при выполнении команд.
# Установка pipenv
pip install pipenv
# Создание окружения и установка пакета
pipenv install requests
# Активация окружения
pipenv shell
# Установка зависимостей из существующего Pipfile
pipenv install
Проблема: установка может занимать много времени из-за разрешения зависимостей.
Решение: использовать флаг --skip-lock для быстрой установки без блокировки версий.
Проблема: конфликты с уже установленными глобальными пакетами.
Решение: всегда работать внутри активированного окружения pipenv.
Случаи использования: проекты, где требуется точная фиксация версий пакетов и простота совместной работы.
Как получить современный инструмент с управлением зависимостями и сборкой?
Poetry использует стандарт pyproject.toml и предлагает полный цикл управления зависимостями, публикации пакетов и сборки. Окружение создаётся автоматически при выполнении команд.
# Установка poetry (рекомендуется через pipx)
pipx install poetry
# Создание нового проекта
poetry new myproject
cd myproject
# Установка пакета (добавляет в pyproject.toml и обновляет poetry.lock)
poetry add requests
# Активация окружения
poetry shell
# Установка зависимостей по файлу
poetry install
Проблема: при миграции с requirements.txt может потребоваться ручное преобразование.
Решение: использовать команду poetry add $(cat requirements.txt) или скрипты конвертации.
Случаи использования: разработка библиотек, сложные проекты с чёткими требованиями к версиям.
Как настроить окружение с не-Python зависимостями (например, для Data Science)?
Conda (из дистрибутива Anaconda или Miniconda) управляет не только Python, но и системными библиотеками. Создаёт изолированную среду с поддержкой разных версий Python и пакетов.
# Создание окружения с конкретной версией Python
conda create -n myenv python=3.9
# Активация
conda activate myenv
# Установка пакетов (например, numpy)
conda install numpy
# Деактивация
conda deactivate
Проблема: окружения Conda могут занимать много места, так как содержат дублирующиеся библиотеки.
Решение: использовать mamba для более быстрой установки и минимизации размера, либо установить только Miniconda.
Проблема: перепутывание каналов (channels) может привести к несовместимости.
Решение: указывать канал явно: conda install -c conda-forge numpy.
Случаи использования: проекты машинного обучения, обработки данных, где требуются библиотеки вроде TensorFlow или PyTorch с не-Python зависимостями.
Как использовать разные версии Python в разных проектах с помощью pyenv?
Pyenv позволяет устанавливать и переключать глобальные и локальные версии Python. В комбинации с venv даёт полный контроль.
# Установка нужной версии (например, 3.9.7)
pyenv install 3.9.7
# Создание локальной версии для текущего каталога
pyenv local 3.9.7
# Создание venv на основе этой версии
python -m venv myenv
# Активация (обычная)
source myenv/bin/activate
Проблема: на Linux может потребоваться установка зависимостей для сборки Python из исходников.
Решение: выполнить команду, предлагаемую pyenv при ошибке, например sudo apt-get install build-essential libssl-dev zlib1g-dev ....
Случаи использования: проекты, требующие разных версий Python, например, тестирование совместимости.
Расширенные примеры работы с инструментами изоляции
Пример 1: Poetry с детальным деревом зависимостей
# Создание нового проекта
poetry new project-data
cd project-data
# Добавление нескольких пакетов
poetry add pandas numpy scikit-learn
# Вывод дерева зависимостей
poetry show --tree
pandas 1.5.3 Powerful data structures for data analysis
├── numpy >=1.21.0 (1.23.5)
└── python-dateutil >=2.8.1 (2.8.2)
└── six >=1.5 (1.16.0)
numpy 1.23.5 NumPy is the fundamental package for array computing with Python.
scikit-learn 1.2.2 A set of python modules for machine learning and data mining
├── numpy >=1.17.3 (1.23.5)
├── scipy >=1.3.2 (1.10.1)
└── joblib >=1.1.1 (1.2.0)
Демонстрируется, как Poetry автоматически разрешает и фиксирует все транзитивные зависимости.
Пример 2: Pipenv с импортом requirements.txt
# Создаём файл requirements.txt с фиксацией версий
echo "flask==2.3.0" > requirements.txt
echo "gunicorn==20.1.0" >> requirements.txt
# Импорт в Pipenv
pipenv install -r requirements.txt
# Просмотр Pipfile
cat Pipfile
[[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] flask = "==2.3.0" gunicorn = "==20.1.0" [dev-packages] [requires] python_version = "3.9"
Pipenv переносит зависимости в собственный формат и автоматически создаёт Pipfile.lock при установке.
Пример 3: venv с указанием версии Python через pyenv
# Установка Python 3.11 через pyenv
pyenv install 3.11.3
# Создание окружения с этой версией
pyenv local 3.11.3
python -m venv myenv-311
# Проверка версии внутри окружения
source myenv-311/bin/activate
python --version
Python 3.11.3
Метод удобен для проектов, требующих конкретной минорной версии Python, которая не является системной.
Пример 4: Conda с экспортом окружения в YAML
# Создание окружения с пакетами для Data Science
conda create -n datascience python=3.10 numpy pandas matplotlib -y
conda activate datascience
# Экспорт окружения
conda env export > environment.yml
# Просмотр файла
cat environment.yml
name: datascience
channels:
- defaults
- conda-forge
dependencies:
- python=3.10
- numpy=1.24.3
- pandas=1.5.3
- matplotlib=3.7.1
- pip:
- some-pip-package==1.0.0
prefix: /home/user/.conda/envs/datascience
Экспорт позволяет воссоздать точное окружение на другой машине или сервере.
Пример 5: Установка зависимостей из локального файла с помощью pip и venv
# Подготовка файла с архивом пакета
pip download flask==2.3.0 -d ./packages
# создаст flask-2.3.0-py2.py3-none-any.whl
# Создание окружения и установка из локальной папки
python -m venv offline-env
source offline-env/bin/activate
pip install --no-index --find-links ./packages flask
Подходит для изолированных сетей или офлайн-установок.