Введение
В современной Python-разработке управление зависимостями и изоляция проектов являются критически важными аспектами. Независимо от того, работаете ли вы над небольшим скриптом или крупным проектом, правильная организация окружений поможет избежать конфликтов между пакетами и обеспечит воспроизводимость вашего кода.
Я подготовил примеры кода, которые помогут нам на практике разобраться с каждым инструментом. Давайте рассмотрим основные подходы к управлению виртуальными окружениями и пакетами в Python.
Зачем нужны виртуальные окружения
Виртуальные окружения позволяют:
Изолировать зависимости между проектами. Это особенно полезно, если один проект требует, например,
Airflow 1
, а другой —Airflow 2
.Облегчить перенос проектов на другие машины, сохраняя список зависимостей в необходимом состоянии.
Упрощать управление пакетами и их версиями.
Без виртуальных окружений библиотеки устанавливаются глобально, что может привести к конфликтам версий и проблемам при запуске проектов.
Python интерпретаторы
Прежде чем погрузиться в виртуальные окружения, важно понимать, с какими версиями Python мы можем работать.
Python постоянно развивается, и новые версии интерпретатора добавляют новые функции, повышают производительность и исправляют ошибки.
Иногда проекты требуют использования конкретной версии Python. Рассмотрим, как работать с разными версиями интерпретатора.
Их можно установить через ваш пакетный менеджер, к примеру через brew или из исходного кода.
В примерах ниже я буду использовать Python 3.12 (Python 3.12.5)
Также весь код и все файлы по статье вы сможете найти в моём репозитории.
venv
Встроенный модуль Python для создания виртуальных окружений.
Создание окружения
Давайте создадим наше первое виртуальное окружение:
python3.12 -m venv venv
После создания окружения мы его сможем увидеть в нашей директории:
.
├── LICENSE
├── README.md
└── venv
Стоит также отметить, что мы можем создать несколько виртуальных окружений с разными именами:
python3.12 -m venv venv1
Или
python3.12 -m venv venv2
И если снова посмотреть на нашу директорию, то мы сможем увидеть наши окружения:
.
├── LICENSE
├── README.md
├── venv
├── venv1
└── venv2
После создания окружения оно не "активировано" – это означает, что все наши вызовы команды python
будут идти от глобального интерпретатора.
Для активации виртуального окружения необходимо выполнить команду:
source venv/bin/activate
Если необходимо, то можно указать другое имя окружения.
К примеру:
source venv1/bin/activate
После этого мы можем запускать наш Python с теми зависимостями, которые есть в нашем окружении.
Для того чтобы проверить, какие пакеты у нас установлены необходимо выполнить команду:
pip list
И мы получим:
Package Version
------- -------
pip 24.2
Добавление пакетов
Все пакеты для установки доступны через PyPi.
Для того чтобы добавить пакет необходимо выполнить команду:
pip install Faker==33.0.0
Важно: если не указать версию пакета, то будет установлена последняя версия. Но вы можете это контролировать.
Теперь мы можем посмотреть, что установлено в нашем виртуальном окружении командой:
pip list
И получим такой список:
Package Version
----------------- -----------
Faker 33.0.0
pip 24.3.1
python-dateutil 2.9.0.post0
six 1.16.0
typing_extensions 4.12.2
Важно: здесь стоит обратить внимание, что помимо того, что мы установили Faker
нужной нам версии, так и получили новые пакеты, которые устанавливаются вместе с Faker
.
Также вы часто можете увидеть на проектах такой файл: requirements.txt
. В нём часто указываются те зависимости, которые необходимы для проекта.
Данный файл мы можем использовать для настройки нашего окружения, для этого необходимо выполнить команду:
pip install -r requirements.txt
Изменение версии пакета
Помимо установки нужной версии пакета мы можем также изменить её во время жизни проекта. Это бывает необходимо, если есть конфликт пакетов или нужны новые методы пакета.
Для того, чтобы изменить текущую версию Faker
мы можем выполнить команду:
pip install Faker==32.0.0
И в логе мы сможем увидеть, что у нас удалилась прошлая версия и установилась новая:
Collecting Faker==32.0.0
Downloading Faker-32.0.0-py3-none-any.whl.metadata (15 kB)
Requirement already satisfied: python-dateutil>=2.4 in ./venv/lib/python3.12/site-packages (from Faker==32.0.0) (2.9.0.post0)
Requirement already satisfied: typing-extensions in ./venv/lib/python3.12/site-packages (from Faker==32.0.0) (4.12.2)
Requirement already satisfied: six>=1.5 in ./venv/lib/python3.12/site-packages (from python-dateutil>=2.4->Faker==32.0.0) (1.16.0)
Downloading Faker-32.0.0-py3-none-any.whl (1.9 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.9/1.9 MB 3.3 MB/s eta 0:00:00
Installing collected packages: Faker
Attempting uninstall: Faker
Found existing installation: Faker 33.0.0
Uninstalling Faker-33.0.0:
Successfully uninstalled Faker-33.0.0
Successfully installed Faker-32.0.0
Удаление пакетов
Также мы можем удалять проект из своего окружения. Для этого необходимо выполнить команду:
pip uninstall Faker
Poetry
Poetry является популярным инструментом для работы с пакетами и зависимостями. Я ниже рассмотрю только основные моменты, а все подробности вы сможете узнать из документации, которая хорошо описана и оформлена.
Создание окружения
Есть несколько видов создания окружений, они подробно описаны в документации. Но мне привычнее создавать через venv
с вызовом нужной версии Python.
Пример:
python3.12 -m venv venv
Или:
python3.11 -m venv venv
И так далее.
Но вы можете установить и инициализировать poetry
удобным вам способом.
Давайте теперь создадим окружение с которым мы будем работать:
python3.12 -m venv poetry_venv
Теперь необходимо установить сам Poetry:
pip install poetry==1.8.4
После этого мы должны в нашем проекте создать pyproject.toml
:
# Assume Python 3.12.
target-version = "py312"
[tool.poetry]
name = "infrastructure_for_data_engineer_virtual_environments"
version = "0.0.1"
description = ""
authors = ["Ivan Korsakov "]
license = "MIT"
readme = "README.md"
package-mode = false
[tool.poetry.urls]
"Homepage" = ""
"Bug Tracker" = ""
"PyPi" = ""
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[tool.poetry.dependencies]
python = "^3.12.1"
Faker = "^33.0.0"
[tool.poetry.group.dev.dependencies]
python = "^3.12.1"
Faker = "^33.0.0"
И если сейчас запустить команду:
poetry lock && \
poetry install
То у нас соберётся виртуальное окружение с необходимыми зависимостями
Добавление пакетов
Чтобы добавить пакет необходимо выполнить команду:
poetry add pendulum==3.0.0
И данный пакет добавится в наше виртуальное окружение и также добавится в pyproject.toml
.
Изменение версии пакета
Изменение версии работает по такой же логике как и добавление:
poetry add pendulum==2.0.0
Удаление пакета
Для удаления пакета необходимо воспользоваться командой:
poetry remove pendulum
Заключение
В этой статье мы рассмотрели основные инструменты для работы с виртуальными окружениями в Python. Каждый инструмент имеет свои сильные и слабые стороны:
venv
отлично подходит для простых проектов и обучения.poetry
незаменим в сложных проектах с множеством зависимостей. Также на рынке пакетных менеджеров существуют аналоги:uv – это новый пакетный менеджер, написан создателями популярного сейчас линтера Ruff. Набирает популярность за счёт своей скорости и "свежего" подхода для работы с зависимостями.
Conda – пакетный менеджер для работы на разных операционных системах
etc При выборе инструмента стоит учитывать:
Размер и сложность проекта
Требования к управлению зависимостями
Опыт команды
Производительность
Интеграцию с другими инструментами
В реальных проектах часто используется комбинация инструментов – например, poetry
для управления зависимостями в основном проекте и venv
для быстрых экспериментов. Главное – выбирать инструмент исходя из конкретных требований задачи.
Также если вам необходима консультация/менторство/мок-собеседование и другие вопросы по дата-инженерии, то вы можете обращаться ко мне. Все контакты указаны по ссылке.
Exinker
poetry настолько хорош, что venv все еще актуален?
а откуда взялся uv в заключении?