Полное руководство по настройкам пакетов в 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 файл) находится в корне проекта или в указанном каталоге.
Расширенные примеры настройки пакетов
Группы зависимостей (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] ...