Упаковка Python

«Спорное» мнение

Использование `setup.py` для упаковки и распространения ваших пакетов Python иногда может быть довольно сложным. Современные инструменты, такие как Poetry и UV, не только делают упаковку намного проще, но и помогают очень удобно управлять зависимостями. UV особенно примечателен тем, что он в 10-100 раз быстрее традиционных инструментов.

Если вы хотите получить больше информации о Poetry, вы можете прочитать следующие статьи:

Для получения исчерпывающего руководства по UV, молниеносно быстрому менеджеру пакетов Python, прочтите: UV: Молниеносно быстрый менеджер пакетов Python.

Введение

Упаковка Python — это процесс подготовки вашего проекта Python к распространению и установке. Существует два основных подхода: традиционный метод с использованием setup.py и современный подход с pyproject.toml (определенный в PEP-517, PEP-518 и PEP-660).

Для получения исчерпывающего руководства по работе с путями к файлам и каталогам, что важно для управления структурой проекта, см. страницу Пути к файлам и каталогам.

Традиционный подход: setup.py

Файл setup.py находится в центре традиционного проекта Python. Он описывает все метаданные о вашем проекте. Вы можете добавить в проект довольно много полей, чтобы придать ему богатый набор метаданных, описывающих проект. Однако есть только три обязательных поля: name, version и packages. Поле name должно быть уникальным, если вы хотите опубликовать свой пакет в Python Package Index (PyPI). Поле version отслеживает различные выпуски проекта. Поле packages описывает, где вы разместили исходный код Python в вашем проекте.

Это позволяет легко устанавливать пакеты Python. Часто достаточно написать:

python setup.py install

и модуль установит себя.

Пример: setup.py

Наш первоначальный setup.py также будет включать информацию о лицензии и повторно использовать файл README.txt для поля long_description. Это будет выглядеть так:

# setup.py: define package metadata for distribution
from distutils.core import setup
setup(
   name='pythonCheatsheet',  # Package name (must be unique on PyPI)
   version='0.1',  # Version number
   packages=['pipenv',],  # List of packages to include
   license='MIT',  # License type
   long_description=open('README.txt').read(),  # Read description from file
)
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Какие три поля являются обязательными в файле setup.py?
A. name, author, license
B. name, description, packages
C. name, version, packages
D. name, version, license

Современный подход: pyproject.toml

Файл pyproject.toml является современным стандартом для конфигурации проектов Python (PEP-517, PEP-518, PEP-660). Он предоставляет унифицированный способ указания требований к системе сборки и метаданных проекта в едином декларативном формате файла.

Преимущества pyproject.toml

  • Декларативный: Все метаданные проекта в одном месте
  • Независимый от системы сборки: Работает с setuptools, poetry, flit и другими бэкендами сборки
  • Без выполнения кода: Безопаснее и предсказуемее, чем setup.py
  • Стандартизированный: Соответствует стандартам PEP для лучшей поддержки инструментов

Пример: pyproject.toml

Вот базовый пример pyproject.toml с использованием setuptools:

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

[project]
name = "pythonCheatsheet"
version = "0.1"
description = "A Python cheatsheet package"
readme = "README.txt"
requires-python = ">=3.8"
license = {text = "MIT"}
authors = [
    {name = "Your Name", email = "your.email@example.com"}
]
classifiers = [
    "Programming Language :: Python :: 3",
    "License :: OSI Approved :: MIT License",
]

[project.optional-dependencies]
dev = [
    "pytest>=7.0",
    "black>=22.0",
]

Установка из pyproject.toml

С pyproject.toml вы можете установить свой пакет с помощью pip:

pip install .

Или в редактируемом режиме:

pip install -e .
Викторина

Войдите в систему, чтобы ответить на эту викторину и отслеживать свой прогресс обучения

Каково основное преимущество pyproject.toml перед setup.py?
A. Он быстрее выполняется
B. Он декларативный, безопаснее (без выполнения кода) и соответствует стандартам PEP
C. Он требует меньше конфигурации
D. Он работает только с Python 3.10+

Выбор правильного подхода

  • Использовать setup.py: Если вы работаете с устаревшими проектами или вам нужен детальный контроль
  • Использовать pyproject.toml: Для новых проектов (рекомендуется), так как это современный стандарт и он обеспечивает лучшую поддержку инструментов

Больше информации можно найти в официальной документации.

Связанные ссылки