Работа с зависимостями и дистрибуцией Python-пакетов

Раздел: Разработка на Python -> Управление пакетами 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 --tree

Python 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 package settings (настройки пакета python)
- Python update package (обновление пакета python)
- Python 3 packages (пакеты в python 3)

Расширенные примеры работы с пакетами 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.

Пакеты Python - comments

En
Python packages (python)