Работа с зависимостями и дистрибуцией Python-пакетов
Управление пакетами Python: от установки до публикации
Пакеты Python – это способ организации и распространения кода. Современная экосистема предлагает несколько инструментов для работы с ними. В этой части рассмотрены основные подходы и их особенности.
Как создать и установить пакет с помощью pip и виртуального окружения?
Наиболее распространённый метод – использование pip в сочетании с venv. Виртуальное окружение изолирует зависимости, а pip управляет их установкой.
# Создание виртуального окружения
python3 -m venv myenv
# Активация (Linux/macOS)
source myenv/bin/activate
# Активация (Windows)
myenv\Scripts\activate
# Установка пакета из PyPI
pip install requests
# Установка из файла зависимостей
pip install -r requirements.txtне работает import python (не работает импорт в python)
Файл requirements.txt создаётся командой pip freeze > requirements.txt. Это фиксирует версии всех установленных пакетов.
Типичная ошибка: установка пакета вне виртуального окружения приводит к конфликтам версий. Решение – всегда создавать и активировать окружение.
Как управлять зависимостями с помощью Poetry?
Poetry – современный инструмент, который автоматизирует создание окружения, управление зависимостями и публикацию пакетов.
# Установка Poetry
curl -sSL https://install.python-poetry.org | python3 -
# Создание нового проекта
poetry new mypackage
# Установка зависимостей
poetry add flask
poetry install
# Просмотр дерева зависимостей
poetry show --treePython core package (базовые пакеты python)
Poetry использует файл pyproject.toml для описания метаданных и зависимостей, что соответствует современным стандартам PEP 621.
Проблема: совместимость с Pip – не все CI/CD системы поддерживают Poetry. Решение – использовать poetry export -f requirements.txt --output requirements.txt для генерации совместимого файла.
Как создать изолированное окружение с Conda?
Conda – менеджер пакетов, популярный в научной среде, также может управлять Python-пакетами и не-Python зависимостями.
# Создание окружения с Python 3.10
conda create -n myenv python=3.10
# Активация
conda activate myenv
# Установка пакета из conda-forge
conda install -c conda-forge numpy
# Установка через pip внутри conda окружения
pip install pandas
Python package version (версия пакета python)
Conda позволяет смешивать пакеты из разных каналов (conda-forge, defaults). Это удобно для проектов с зависимостями от библиотек C/C++.
Ошибка: использование pip install после conda install может сломать окружение. Рекомендуется сначала устанавливать всё через conda, а только потом через pip.
Как упаковать свой код в wheel с помощью setuptools?
Для распространения пакета в бинарном формате используется формат wheel. Сборка выполняется с помощью setuptools.
# Структура проекта
mypackage/
__init__.py
core.py
setup.py (или pyproject.toml)
# Пример setup.py
from setuptools import setup, find_packages
setup(
name='mypackage',
version='0.1.0',
packages=find_packages(),
install_requires=[
'requests>=2.0',
],
)Python package dependencies (зависимости пакетов python)
Сборка: python setup.py sdist bdist_wheel. В результате появляются файлы .tar.gz и .whl в папке dist/.
Частая ошибка: отсутствие __init__.py в пакете приводит к тому, что Python не видит модуль. Решение – убедиться, что файл есть или использовать find_packages(include=['mypackage*']).
Как опубликовать пакет на PyPI?
PyPI (Python Package Index) – официальный репозиторий. Публикация выполняется через twine.
# Установка twine
pip install twine
# Сборка пакета
python -m build
# Проверка на наличие ошибок
twine check dist/*
# Загрузка на Test PyPI (рекомендуется сначала проверить)
twine upload --repository testpypi dist/*
# Загрузка на PyPI
twine upload dist/*Перед публикацией необходимо создать аккаунт на pypi.org и получить API-токен. Для автоматизации используют .pypirc.
Проблема: загрузка пакета с уже существующей версией вызывает ошибку 400. Решение – увеличить версию в setup.py или удалить старые дистрибутивы из dist/.
Расширенные примеры работы с пакетами Python
Создание пакета с pyproject.toml (PEP 621)
# pyproject.toml
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "mypackage"
version = "0.2.0"
description = "Пример современного пакета"
readme = "README.md"
authors = [{name = "Иван Иванов", email = "ivan@example.com"}]
license = {text = "MIT"}
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
]
dependencies = [
"requests>=2.25",
"click",
]
[project.optional-dependencies]
dev = ["pytest", "twine"]
[tool.setuptools.packages.find]
include = ["mypackage*"]Результат: после установки пакета с помощью `pip install .` все зависимости будут установлены автоматически.
Использование pip freeze с группировкой
# Создание файла с зависимостями только для продакшена
pip freeze --exclude-editable > requirements-prod.txt
# Или с помощью pipenv
pipenv requirements > requirements.txtПример содержимого requirements-prod.txt: requests==2.28.1 click==8.1.3
Интеграция с Docker для воспроизводимости
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "main.py"]Это гарантирует, что все зависимости будут установлены одинаково в любой среде.
Сборка бинарного дистрибутива с Cython (ускорение кода)
# setup.py с Cython-расширениями
from setuptools import setup, Extension
from Cython.Build import cythonize
extensions = [
Extension("fastcalc", ["fastcalc.pyx"])
]
setup(
name="fastcalc",
ext_modules=cythonize(extensions),
)После сборки `python setup.py build_ext --inplace` получаем скомпилированный модуль .so (на Linux).
Публикация пакета с помощью Poetry и GitHub Actions
# .github/workflows/publish.yml
name: Publish to PyPI
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.11'
- run: pip install poetry
- run: poetry config pypi-token.pypi ${{ secrets.PYPI_TOKEN }}
- run: poetry build
- run: poetry publishПосле каждого релиза пакет автоматически публикуется на PyPI.