Python Packaging Tools: сравнение и практические примеры
Основные подходы к сборке Python-пакетов
Как собрать и опубликовать пакет с минимальными усилиями?
Наиболее эффективное решение на сегодняшний день — Poetry. Poetry объединяет управление зависимостями, виртуальными окружениями и публикацию в едином интерфейсе. Установка: pip install poetry или через официальный скрипт.
poetry new mypackage
cd mypackage
poetry add requests
poetry build
poetry publishMicrosoft vs python (python в visual studio)
Пояснение: poetry new создает структуру проекта, poetry add добавляет зависимость, poetry build собирает wheel и sdist, poetry publish отправляет пакет в PyPI.
Типичная ошибка — конфликт зависимостей. Решение: удалить poetry.lock и выполнить poetry update. Для платформенных зависимостей используйте маркеры в pyproject.toml.
Как создать пакет, совместимый с классическими инструментами?
Setuptools с setup.py остается стандартом для многих проектов. Подходит для интеграции с CI/CD и legacy-системами.
from setuptools import setup, find_packages
setup(
name='mypackage',
version='0.1.0',
packages=find_packages(),
install_requires=['requests'],
entry_points={'console_scripts': ['mycli=mypackage.cli:main']},
)Microsoft code python (настройка python в visual studio code)
Пояснение: find_packages() автоматически находит подпакеты, install_requires задает зависимости, entry_points создает консольные команды.
Проблема: pip может неверно разрешать зависимости при использовании только setup.py. Решение: добавить pyproject.toml с настройками.
Как управлять зависимостями и окружением в одном инструменте?
Pipenv сочетает Pipfile и Pipfile.lock, упрощая работу с виртуальными окружениями. Хорошо подходит для приложений, а не библиотек.
pipenv install requests
pipenv shell
pipenv lock -r > requirements.txt
Ide программы python (ide для python)
Пояснение: pipenv install создает окружение, pipenv shell активирует его, pipenv lock -r экспортирует зависимости в формат requirements.txt.
Недостаток: медленная работа при большом количестве пакетов. Для публикации требуется дополнительный setup.py.
Как быстро собрать простой пакет без лишних настроек?
Flit ориентирован на минимализм. Подходит для небольших библиотек, не требующих сложных скриптов сборки.
[build-system]
requires = ['flit_core>=3.2.0']
build-backend = 'flit_core.buildapi'
[project]
name = 'mypackage'
version = '0.1.0'
dependencies = ['requests']программа для написания кода на python (программа для написания кода на python (ide))
Пояснение: pyproject.toml описывает сборку и зависимости. Команда flit build собирает пакет, flit publish публикует.
Ограничение: нет поддержки расширенных сценариев (например, C-расширений). При конфликтах версий flit может не предложить альтернатив.
Как получить гибкую систему сборки с матрицами окружений?
Hatch поддерживает несколько окружений (тестирование, линтинг, развертывание) и кастомизируемые фазы сборки. Подходит для крупных проектов.
[tool.hatch.envs.test]
features = ['test']
[project]
name = 'mypackage'
version = '0.1.0'
dependencies = ['requests']Пояснение: hatch env show выводит список окружений, hatch run test:pytest запускает тесты в окружении test.
Сложность: документация обширна, но новички могут запутаться в настройках. Требуется Python 3.8+.
Расширенные примеры использования Poetry
Настройка dev-зависимостей и групп зависимостей:
[tool.poetry.dependencies]
python = "^3.8"
requests = "^2.28"
[tool.poetry.group.dev.dependencies]
pytest = "^7.0"
tox = "^4.0"Сборка пакета с native-расширениями (Cython):
[build-system]
requires = ["poetry-core>=1.0.0", "cython"]
build-backend = "poetry.core.masonry.api"Публикация с токеном:
poetry config pypi-token.pypi
poetry publish --build Setuptools с pyproject.toml (современный способ)
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "mypackage"
version = "0.2.0"
dependencies = ["click"]
[project.scripts]
mycli = "mypackage:main"Результат сборки:
dist/ mypackage-0.2.0-py3-none-any.whl mypackage-0.2.0.tar.gz
Flit: публикация в тестовый PyPI
flit publish --repository testpypiHatch: создание потока сборки с проверкой качества
[tool.hatch.envs.lint.scripts]
check = "flake8"
# запуск: hatch run lint:checkИспользование матрицы окружений для тестирования на разных версиях Python:
[tool.hatch.envs.test]
matrix = [
{ python = "3.9" },
{ python = "3.10" },
]Результат: каждый элемент матрицы создает отдельное окружение.