Полное руководство по настройкам пакетов в Python

Раздел: Разработка на Python -> Управление пакетами Python

Настройки пакета на основе pyproject.toml (PEP 621)

Современный стандарт для описания пакетов Python - файл pyproject.toml. Он заменяет устаревшие setup.py и setup.cfg и поддерживается большинством инструментов сборки (setuptools, poetry, flit). Основная цель - централизованное хранение метаданных, зависимостей и параметров сборки в едином формате TOML.

Как описать пакет с помощью pyproject.toml и setuptools?

Для использования pyproject.toml с setuptools нужно указать систему сборки и конфигурацию в секции [project]. Пример минимального файла:


[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "mypackage"
version = "0.1.0"
description = "Пример пакета"
readme = "README.md"
license = {text = "MIT"}
authors = [{name = "Иван", email = "ivan@example.com"}]
dependencies = [
    "requests>=2.25",
    "click"
]
  

не работает import python (не работает импорт в python)

Пояснение шагов: Секция [build-system] указывает, что для сборки нужен setuptools версии 61.0 или новее, а бэкенд - setuptools.build_meta. Секция [project] содержит метаданные: имя, версию, описание, авторов, лицензию и зависимости. Зависимости указываются как список строк в формате PEP 508.

После создания файла можно установить пакет в режиме разработки командой pip install -e .. Типичная ошибка - отсутствие файла README.md, если он указан в readme. Решение: создать файл или удалить поле readme.

Частая проблема: Ошибка "Backend 'setuptools.build_meta' is not available" возникает при устаревшей версии pip или setuptools. Для решения обновить инструменты: pip install --upgrade pip setuptools.

Как настроить пакет с помощью setup.py (классический подход)?

Несмотря на современные альтернативы, setup.py по-прежнему используется, особенно для пакетов с динамической конфигурацией или плагинами. Файл представляет собой скрипт Python с вызовом функции setup из setuptools. Пример:


from setuptools import setup, find_packages

setup(
    name='mypackage',
    version='0.1.0',
    description='Пример пакета с setup.py',
    packages=find_packages(),
    install_requires=[
        'requests>=2.25',
        'click',
    ],
    entry_points={
        'console_scripts': [
            'mycli=mypackage.cli:main',
        ],
    },
)
  

Python core package (базовые пакеты python)

Пояснение: find_packages() автоматически находит все подпакеты. install_requires - зависимости. entry_points позволяет создавать консольные скрипты. Цель такого подхода - гибкость: можно выполнять произвольный код Python при сборке.

Ошибка: если пакет не найден, проверьте структуру каталогов. Типичная ситуация - пустой список packages при отсутствии __init__.py в корне пакета. Решение: добавить пустой __init__.py или использовать find_packages(where='src').

Как использовать setup.cfg для разделения конфигурации и кода?

Файл setup.cfg позволяет вынести метаданные и настройки из setup.py, делая код сборки чище. Он поддерживается setuptools как альтернатива прямой конфигурации. Пример:


[metadata]
name = mypackage
version = 0.1.0
description = Пример настройки через setup.cfg
license = MIT

[options]
packages = find:
install_requires =
    requests>=2.25
    click

[options.entry_points]
console_scripts =
    mycli = mypackage.cli:main
  

Python package version (версия пакета python)

Пояснение: Секция [metadata] содержит метаданные, [options] - параметры сборки. Ключ "packages = find:" эквивалентен find_packages(). Преимущество - декларативный стиль, отсутствие кода Python. Цель - упростить поддержку и сделать конфигурацию читаемой для инструментов.

Ошибка: при использовании setup.cfg вместе с setup.py необходимо, чтобы setup.py содержал только вызов setup() без аргументов. Иначе аргументы из setup.py переопределят настройки из cfg. Решение: в setup.py оставить только from setuptools import setup; setup().

Как настроить пакет с помощью Poetry?

Poetry - современный менеджер зависимостей и сборки. Использует собственный формат pyproject.toml с секцией [tool.poetry]. Пример конфигурации:


[tool.poetry]
name = "mypackage"
version = "0.1.0"
description = "Пакет, управляемый Poetry"
authors = ["Иван "]
license = "MIT"

[tool.poetry.dependencies]
python = "^3.8"
requests = ">=2.25"
click = "*"

[tool.poetry.dev-dependencies]
pytest = "^7.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
  

Python package dependencies (зависимости пакетов python)

Пояснение: Зависимости делятся на основные (dependencies) и для разработки (dev-dependencies). Версия Python указывается с помощью caret (^). Для установки используется команда poetry install. Цель - удобная изоляция окружения и автоматическая генерация lock-файла.

Ошибка: при попытке публикации пакета через PyPI может возникнуть конфликт версий, если не указать правильные ограничения. Решение: перед публикацией выполнить poetry check и poetry build.

Как настроить пакет с помощью Flit?

Flit - лёгкий инструмент для сборки и публикации пакетов. Использует pyproject.toml с секцией [tool.flit.metadata]. Пример:


[tool.flit.metadata]
module = "mypackage"
author = "Иван"
author-email = "ivan@example.com"
home-page = "https://example.com"
classifiers = [
    "License :: OSI Approved :: MIT License",
]
requires-python = ">=3.8"

[tool.flit.sdist]
include = ["src/"]

[build-system]
requires = ["flit_core>=3.2"]
build-backend = "flit_core.buildapi"
  

Пояснение: Вместо имени пакета Flit определяет модуль (module). Автоматически упаковывает все файлы в каталоге модуля. Цель - минималистичная настройка без указания списка пакетов. Подходит для простых пакетов с одним модулем.

Ошибка: если модуль не найден, Flit выдаст сообщение об ошибке. Убедитесь, что модуль (файл __init__.py или .py файл) находится в корне проекта или в указанном каталоге.

- Python package settings (настройки пакета python)
- Python update package (обновление пакета python)
- Python 3 packages (пакеты в python 3)

Расширенные примеры настройки пакетов

Группы зависимостей (optional-dependencies) в pyproject.toml

Можно определить дополнительные группы зависимостей, например для тестирования или документации. Пример pyproject.toml с setuptools:

Пример

[project]
name = "mypackage"
version = "0.1.0"
dependencies = [
    "requests>=2.25",
]

[project.optional-dependencies]
test = [
    "pytest>=7",
    "pytest-cov",
]
docs = [
    "sphinx",
    "myst-parser",
]

Установить с группой: pip install mypackage[test] или pip install -e .[test,docs]. Результат - будут установлены основные зависимости и выбранные группы.

Пояснение: optional-dependencies полезны для разделения окружений (dev, test, doc). Это избегает установки лишних пакетов в продакшн.

Динамическое определение версии из модуля

Часто версию хранят в __init__.py и читают в setup.py или pyproject.toml. Пример с setuptools и setup.py:

Пример

# mypackage/__init__.py
__version__ = "0.1.0"

# setup.py
import re
from setuptools import setup

with open("mypackage/__init__.py", "r") as f:
    version = re.search(r"__version__\s*=\s*[\"']([^\"']+)[\"']", f.read()).group(1)

setup(
    name="mypackage",
    version=version,
    ...
)

Для pyproject.toml можно использовать плагин setuptools-scm, который автоматически извлекает версию из git тегов. Пример pyproject.toml:

Пример

[build-system]
requires = ["setuptools>=61.0", "setuptools-scm>=6.2"]
build-backend = "setuptools.build_meta"

[project]
name = "mypackage"
dynamic = ["version"]

[tool.setuptools_scm]

После этого версия извлекается автоматически на основе git-тегов. Результат: pip install -e . установит пакет с версией, полученной из коммита (например, 0.1.0.dev5).

Настройка сборки C-расширений с setuptools

Для пакетов с расширениями на C/C++ используется секция ext_modules. Пример setup.py:

Пример

from setuptools import setup, Extension

module = Extension(
    'mypackage._core',
    sources=['src/core.c'],
    include_dirs=['include']
)

setup(
    name='mypackage',
    version='0.1.0',
    ext_modules=[module],
    packages=['mypackage'],
)

Результат: при сборке компилируется core.c и создаётся модуль _core.so (или .pyd). Типичная ошибка - отсутствие компилятора C. Решение: установить build-essential (Linux) или Visual Studio Build Tools (Windows).

Публикация пакета на PyPI с классификаторами

Классификаторы (classifiers) помогают пользователям найти пакет по категориям. Пример pyproject.toml:

Пример

[project]
classifiers = [
    "Development Status :: 4 - Beta",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.8",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Topic :: Software Development :: Libraries",
]

После сборки (python -m build) и публикации (twine upload dist/*) классификаторы отображаются на странице PyPI.

Использование плагина setuptools-scm для управления версией

Плагин setuptools-scm автоматически вычисляет версию на основе git тегов. Пример конфигурации в pyproject.toml:

Пример

[build-system]
requires = ["setuptools>=61.0", "setuptools-scm>=6.2"]
build-backend = "setuptools.build_meta"

[tool.setuptools_scm]
version_scheme = "post-release"
local_scheme = "no-local-version"

Если в git есть тег v0.1.0, то версия будет 0.1.0. Если после тега есть коммиты, версия станет 0.1.0.post1+. Результат виден при вызове python -c "import mypackage; print(mypackage.__version__)".

Настройка консольных скриптов (entry points) в pyproject.toml

Консольные скрипты позволяют запускать функции из пакета как команды терминала. Пример:

Пример

[project.scripts]
mycli = "mypackage.cli:main"
another = "mypackage.utils:run"

После установки пакета команды mycli и another будут доступны в терминале. Результат проверки:

$ mycli --help
usage: mycli [-h]
...

Настройки пакета Python - comments

En
Python package settings (python)