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.3PHP (Composer): файл composer.json содержит описание пакета.
{
"name": "vendor/package",
"require": {
"monolog/monolog": "^2.0"
}
}Частые ошибки при работе
Отсутствие обязательных аргументов приводит к ошибке на этапе сборки.
from setuptools import setup
setup() # Не указаны name и versionerror: 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-расширениями:
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',
)Использование динамического определения версии:
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(),
# ... другие параметры
)