Управление средой Python: виртуальные окружения для проектов

Раздел: Администрирование -> Управление окружением Python

Виртуальные окружения в Python: общие принципы

Виртуальное окружение изолирует зависимости одного проекта от другого. Это позволяет использовать разные версии библиотек и даже разные версии интерпретатора Python без конфликтов. В разделе Администрирование (Управление окружением Python) рассматриваются основные инструменты: встроенный venv, более гибкий virtualenv, универсальный conda и современный менеджер Poetry.

Как создать изолированное окружение с помощью встроенного модуля venv?

Модуль venv входит в стандартную библиотеку Python начиная с версии 3.3. Это самый простой и рекомендуемый способ для большинства проектов. Для создания окружения выполняется команда:

python -m venv myenv

Python environment (настройка виртуального окружения python)

Где myenv - имя каталога, в котором будет размещено окружение. После создания необходимо его активировать:

  • Windows (cmd):
    myenv\Scripts\activate

    Updating python (обновление python)

  • macOS/Linux (bash):
    source myenv/bin/activate

При активации в командной строке появляется префикс с именем окружения. Для выхода используется команда deactivate.

Типичные проблемы:

  • Ошибка 'python' не является внутренней или внешней командой - не установлен Python в переменную PATH. Решение: указать полный путь к интерпретатору, например C:\Python310\python -m venv myenv.
  • На Linux может потребоваться установка пакета python3-venv:
    sudo apt install python3-venv
  • Удаление окружения - достаточно удалить папку myenv.

Как использовать virtualenv для тонкой настройки окружения?

Пакет virtualenv - предшественник venv, но до сих пор используется, когда требуется больше контроля, например, копирование системных site-packages или привязка к конкретной версии Python. Установка: pip install virtualenv. Создание окружения:

virtualenv --python=python3.10 myenv

Флаг --python указывает путь или имя интерпретатора. Если не указать, используется системный Python по умолчанию. Дополнительные опции:

  • --system-site-packages - разрешить доступ к пакетам, установленным глобально.
  • --no-site-packages - изолировать полностью (по умолчанию).

Частые ошибки:

  • Установка virtualenv в глобальный pip может привести к конфликтам. Рекомендуется использовать pipx или устанавливать в отдельное окружение.
  • При указании несуществующей версии Python возникает RuntimeError: failed to find interpreter. Проверить доступные версии можно командой which python3.10 (Linux/macOS) или where python (Windows).

Как управлять окружением с помощью conda, если проект включает не только Python?

Anaconda/Miniconda предоставляют менеджер окружений conda, который умеет устанавливать не только Python-пакеты, но и системные библиотеки (например, графические драйверы). Создание окружения с определённой версией Python:

conda create -n myenv python=3.9

Активация: conda activate myenv. Деактивация: conda deactivate. Установка пакетов через conda:

conda install numpy pandas

Экспорт окружения в файл environment.yml:

conda env export > environment.yml

Воссоздание окружения из файла:

conda env create -f environment.yml

Проблемы и решения:

  • Редкая ошибка CondaHTTPError - недоступен канал. Исправить сменой зеркала или указанием conda config --add channels conda-forge.
  • Большой размер conda (более 3 ГБ для Anaconda). Можно использовать Miniconda (около 500 МБ).
  • При использовании pip внутри conda возможны конфликты зависимостей. Рекомендуется либо только conda, либо только pip.

Как автоматизировать управление окружением и зависимостями с помощью Poetry?

Poetry - современный менеджер, который объединяет управление окружением и пакетами. Установка (Linux/macOS):

curl -sSL https://install.python-poetry.org | python3 -

Создание нового проекта:

poetry new myproject
cd myproject

Poetry автоматически создаёт виртуальное окружение и файл pyproject.toml. Установка зависимостей:

poetry add requests

Активация окружения: poetry shell. Выполнение команды внутри окружения без активации: poetry run python script.py. Файл poetry.lock гарантирует воспроизводимость.

Типичные сложности:

  • При добавлении пакетов с системными требованиями (например, psycopg2) нужны компиляторы. Решение: установить build-essential (Linux) или использовать conda.
  • Poetry может конфликтовать с глобально установленными пакетами. Для изоляции стоит использовать pipx для установки самого Poetry.
  • Удаление окружения: poetry env remove python3.9 (указывается версия).

Расширенные примеры использования инструментов

1. venv с настройкой пути и системными пакетами

Иногда требуется включить в окружение глобальные пакеты (например, системный numpy, установленный вручную). Используется опция --system-site-packages. Пример:

Пример
python -m venv --system-site-packages myenv

Проверка того, что глобальные пакеты доступны:

Пример
source myenv/bin/activate
python -c "import numpy; print(numpy.__version__)"

Результат (если numpy установлен глобально):

1.24.3

Если опция опущена, импорт вызовет ModuleNotFoundError.

2. virtualenv с привязкой к конкретному интерпретатору и копированием site-packages

На системе могут быть установлены несколько версий Python. Следующая команда создаёт окружение на Python 3.9 с копированием глобальных пакетов:

Пример
virtualenv --python=/usr/bin/python3.9 --system-site-packages myenv_virtual

Активация и проверка версии интерпретатора:

Пример
source myenv_virtual/bin/activate
python --version

Вывод:

Python 3.9.13

Для полной изоляции (без глобальных пакетов) используется --no-site-packages (действует по умолчанию).

3. Conda: создание окружения с точным набором пакетов из environment.yml

Допустим, требуется воссоздать окружение для научного проекта. Файл environment.yml может содержать:

Пример
name: science
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.8
  - numpy=1.21
  - pandas=1.3
  - matplotlib=3.4
  - pip
  - pip:
    - scipy==1.7

Команда для создания:

Пример
conda env create -f environment.yml

После выполнения окружение science будет готово. Список пакетов проверяется так:

Пример
conda activate science
conda list

Пример фрагмента вывода:

# packages in environment at /home/user/miniconda3/envs/science:
#
numpy                    1.21.5          py38h20f2e39_0    conda-forge
pandas                   1.3.5            py38h47e9c7a_0    conda-forge
...

Ошибка, если какой-то пакет не найден в каналах: ResolvePackageNotFound. Решение - добавить нужный канал или заменить версию.

4. Poetry: добавление зависимостей для разработки и публикация

Poetry позволяет разделять зависимости на основные и dev. В проекте, инициализированном командой poetry new, добавление dev-зависимости:

Пример
poetry add --dev pytest black

В результате в pyproject.toml появляется секция:

Пример
[tool.poetry.dev-dependencies]
pytest = "*"
black = "*"

Вывод команды poetry show --tree демонстрирует дерево зависимостей:

Пример
poetry show --tree

Пример для простого проекта:

requests 2.28.1 Dependencies
├── certifi >=2017.4.17
├── charset-normalizer >=2.0.2,<3
├── idna >=2.5,<4
└── urllib3 >=1.21.1,<1.27
pytest 7.2.0 (dev)

Для публикации пакета на PyPI требуется заполнить метаданные в pyproject.toml и выполнить:

Пример
poetry build
poetry publish

При отсутствии API-токена возникнет ошибка HTTP 401. Необходимо настроить репозиторий: poetry config pypi-token.pypi <token>.

Настройка виртуального окружения Python - comments

En
Python environment (python)