Setuptools.setup: примеры (PYTHON)

Использование setuptools.setup для создания пакетов Python
Раздел: Упаковка, Дистрибуция
setuptools.setup(**attrs): None

Описание функции setuptools.setup

Функция setuptools.setup является центральной при создании дистрибутивов пакетов Python. Ее применяют в файле setup.py или при настройке pyproject.toml для определения метаданных проекта, зависимостей и правил сборки.

Функция не возвращает значение в традиционном смысле, ее вызов инициирует процесс сборки дистрибутива или установки пакета. Основные аргументы:

  • name: имя пакета для публикации в PyPI.
  • version: текущая версия пакета.
  • description: краткое описание.
  • author: имя автора.
  • packages: список Python-пакетов для включения.
  • install_requires: список зависимостей для установки.
  • entry_points: точки входа для создания консольных или GUI-скриптов.
  • include_package_data: флаг для включения не-Python файлов.
  • package_data: словарь с описанием включаемых данных.
  • classifiers: список тропиков для каталогизации пакета.

Простые примеры использования

Минимальная конфигурация для пакета:

from setuptools import setup, find_packages

setup(
    name='mypackage',
    version='0.1.0',
    packages=find_packages(),
)
# Выполнение команды сборки:
# python setup.py sdist bdist_wheel

Пакет с зависимостями и скриптом:

setup(
    name='mycli',
    version='1.0',
    install_requires=['requests>=2.25', 'click==8.0'],
    entry_points={
        'console_scripts': [
            'mycli = mycli.main:start',
        ],
    },
)
# После установки пакета в системе появляется команда mycli.

Альтернативные инструменты в Python

Poetry предоставляет управление зависимостями и сборку через файл pyproject.toml. Инструмент подходит для современных проектов с комплексными требованиями.

Flit упрощает публикацию чистых Python-пакетов, работая напрямую с pyproject.toml. Его применение рационально для простых модулей.

Hatch является менеджером проектов с поддержоками окружений и сборки. Инструмент подходит для проектов с необходимостью изоляции окружений.

Аналоги в других языках программирования

JavaScript (npm): файл package.json определяет метаданные и зависимости.

{
  "name": "mypackage",
  "version": "1.0.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

Go: модуль определяют в файле go.mod.

module example.com/mymodule

go 1.21

require github.com/example/lib v1.2.3

PHP (Composer): файл composer.json содержит описание пакета.

{
    "name": "vendor/package",
    "require": {
        "monolog/monolog": "^2.0"
    }
}

Частые ошибки при работе

Отсутствие обязательных аргументов приводит к ошибке на этапе сборки.

from setuptools import setup

setup()  # Не указаны name и version
error: error in setup.cfg: command 'bdist_wheel' has no such option 'name'

Некорректное указание пакетов вызывает их исключение из дистрибутива.

setup(
    name='test',
    version='0.1',
    packages=[],  # Пакеты не указаны, find_packages() не вызван
)
# Создается пустой архив без Python-модулей.

Изменения в новых версиях setuptools

Версия setuptools 61.0.0 представила обязательное использование абстрактных синтаксических деревьев для парсинга setup.py. Изменение повысило безопасность, но потребовало корректного синтаксиса в файле.

Добавлена расширенная поддержка конфигурации через pyproject.toml согласно PEP 621. Параметры, такие как project.name и project.version, теперь читаются из этого файла.

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

Пакет с данными и C-расширениями:

Пример python
from setuptools import setup, Extension, find_packages
from glob import glob

setup(
    name='advanced',
    version='2.0',
    packages=find_packages(),
    include_package_data=True,
    package_data={
        'advanced': ['data/*.json', 'configs/*.yaml'],
    },
    ext_modules=[
        Extension('advanced.speedup', 
                  sources=glob('src/*.c'),
                  include_dirs=['include']),
    ],
    scripts=['scripts/helper.sh'],
    python_requires='>=3.8',
)

Использование динамического определения версии:

Пример python
import re
from setuptools import setup

def get_version():
    with open('advanced/__init__.py') as f:
        return re.search(r"__version__ = '(.*)'", f.read()).group(1)

setup(
    name='advanced',
    version=get_version(),
    # ... другие параметры
)

питон setuptools.setup function comments

En
Setuptools.setup Configure package distribution