Виртуальные среды и пакетные менеджеры
Эта страница находится в процессе подготовки и не является финальной версией. Содержание будет дорабатываться и обновляться в течение текущего семестра.
Модули и импорты
Модуль в Python — это файл с исходным кодом. Имя модуля доступно через __name__, а сам модуль является объектом и может быть присвоен переменной.
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():
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:
- Текущая директория
- Переменная окружения
PYTHONPATH - Директории стандартной библиотеки
- Директории site-packages (установленные пакеты)
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 # запуск в окружении
[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
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
[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 устарели.