Перейти к основному содержимому

Виртуальные среды и пакетные менеджеры

📺 Слайды к лекции

Материалы в разработке

Эта страница находится в процессе подготовки и не является финальной версией. Содержание будет дорабатываться и обновляться в течение текущего семестра.

Модули и импорты

Модуль в Python — это файл с исходным кодом. Имя модуля доступно через __name__, а сам модуль является объектом и может быть присвоен переменной.

imports.py
import numpy
numpy.array([1, 2, 3])

import numpy as np # псевдоним
np.array([1, 2, 3])

from numpy import array # конкретный объект
array([1, 2, 3])

from numpy import * # все публичные имена (не рекомендуется!)
Частая ошибка

from module import * — плохая практика:

  • Линтеры не видят, что именно импортируется
  • Можно случайно перезаписать существующую переменную
  • По умолчанию не импортирует имена, начинающиеся с _

Используйте __all__ в модуле, чтобы явно указать, что экспортируется.

Механизм импорта

Модули импортируются один раз — повторный import не перезагружает модуль. Для перезагрузки используйте importlib.reload():

reload.py
import module
print(module.int_variable) # 1
module.int_variable += 1
import module # НЕ перезагрузит!
print(module.int_variable) # 2

import importlib
importlib.reload(module)
print(module.int_variable) # 1 — перезагружено

sys.path и поиск модулей

Python ищет модули в порядке, заданном sys.path:

  1. Текущая директория
  2. Переменная окружения PYTHONPATH
  3. Директории стандартной библиотеки
  4. Директории site-packages (установленные пакеты)
sys_path.py
import sys
for path in sys.path:
print(path)

Пакеты и __init__.py

Пакет — это директория с модулями. Файл __init__.py делает директорию пакетом и может содержать инициализационный код:

my_package/
├── __init__.py
├── module_a.py
└── subpackage/
├── __init__.py
└── module_b.py

Виртуальные окружения

Определение

Виртуальное окружение — изолированная копия интерпретатора Python с собственным набором установленных пакетов. Позволяет разным проектам использовать разные версии библиотек.

venv (встроенный)

# Создание
python -m venv .venv

# Активация (Linux/macOS)
source .venv/bin/activate

# Активация (Windows)
.venv\Scripts\activate

# Деактивация
deactivate

virtualenv

Сторонний инструмент, быстрее venv и с дополнительными возможностями:

pip install virtualenv
virtualenv .venv --python=python3.12
Практический совет

Всегда создавайте виртуальное окружение для каждого проекта. Не устанавливайте пакеты в системный Python — это может привести к конфликтам версий.

pip и requirements.txt

pip — стандартный менеджер пакетов Python.

pip install requests           # установка
pip install requests==2.31.0 # конкретная версия
pip install -r requirements.txt # из файла
pip freeze > requirements.txt # экспорт установленных
pip uninstall requests # удаление
Важно

pip freeze фиксирует ВСЕ установленные пакеты, включая транзитивные зависимости. Это может создать проблемы при обновлении. Для лучшего контроля используйте Poetry или pip-tools.

Poetry

Poetry — современный инструмент для управления зависимостями и сборки пакетов. Использует pyproject.toml вместо setup.py + requirements.txt.

pip install poetry
poetry new my-project # создать проект
poetry init # инициализировать в существующем
poetry add requests # добавить зависимость
poetry add --dev pytest # dev-зависимость
poetry install # установить все зависимости
poetry run python main.py # запуск в окружении
pyproject.toml
[tool.poetry]
name = "my-project"
version = "0.1.0"
description = ""

[tool.poetry.dependencies]
python = "^3.12"
requests = "^2.31"

[tool.poetry.dev-dependencies]
pytest = "^8.0"
Практический совет

Poetry создаёт poetry.lock — файл с точными версиями всех зависимостей. Всегда коммитьте poetry.lock в репозиторий для воспроизводимых сборок.

Pipenv

Pipenv совмещает pip и virtualenv в одном инструменте:

pip install pipenv
pipenv install requests
pipenv install --dev pytest
pipenv shell # активировать окружение
pipenv run python main.py

Использует Pipfile и Pipfile.lock вместо requirements.txt.

uv — современный быстрый менеджер

uv — написанный на Rust менеджер пакетов от Astral (создатели ruff). Работает в 10-100 раз быстрее pip:

pip install uv
uv pip install requests
uv pip compile requirements.in -o requirements.txt
uv venv .venv

Сборка и публикация пакетов

setuptools и wheel

setup.py
from setuptools import setup, find_packages

setup(
name="my-package",
version="0.1.0",
packages=find_packages(),
install_requires=["requests>=2.25"],
)
python -m build              # сборка wheel и sdist
python -m twine upload dist/* # публикация на PyPI

Современный подход: pyproject.toml

pyproject.toml
[build-system]
requires = ["setuptools>=68.0", "wheel"]
build-backend = "setuptools.backends._legacy:_Backend"

[project]
name = "my-package"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = ["requests>=2.25"]
Определение

PEP 517/518 стандартизировали систему сборки Python-пакетов. Файл pyproject.toml теперь является единственным необходимым конфигурационным файлом — setup.py и setup.cfg устарели.