Курс упаковки Python

Оригинал статьи Martin Thoma Python Packaging Course от 8-02-2020.

Среда Python устарела. Разработка Python началась до появления Интернета. Естественно, такая выращенная среда представляет собой месиво:

В этом курсе вы узнаете подробности о упаковке Python и о том, как связаны все инструменты.

Типы приложений

  • Библиотека - должна быть включена в другой код. Она никогда не будет выполнена напрямую. У нее НЕТ точки входа.

  • Приложение CLI - приложение командной строки должно выполняться в его собственной среде. Оно получает ввод через интерфейс командной строки, может обращаться к локальному хранилищу или делать веб-запросы. Оно может читать переменные среды. Его надо запустить, выполнить задачи и закончить. У него есть точка входа.

  • Приложение GUI - подобно приложениям командной строки, но с графическим интерфейсом вместо интерфейса командной строки.

  • Служба - подобно приложению командной строки, но никогда не завершается. Она просто работает в фоновом режиме.

  • Записные книжки - специальные скрипты, которые в основном используются для анализа данных.

Среда разработки

Мне нравится оболочка ZSH с плагином Oh My ZSH и Sublime Text в качестве редактора с множеством разных плагинов; я записал некоторые из моих плагинов Sublime Text.

Распространенной альтернативой ZSH является Fish. Распространенными альтернативами Sublime Text являются Atom и VS Code. Если вы хотите большего, PyCharm.

Убедитесь, что у вас установлены git, pipenv, cookiecutter и pre-commit.

Запуск проекта

Предположим, вы хотите разработать новый awesome_project. Затем вы создаете папку и делаете ее репозиторием git:

Чтобы гарантировать, что отказ жесткого диска действительно приведет к минимальным потерям в работе, и для обеспечения совместной работы, мы добавляем удаленный репозитарий. Github и Gitlab - отличный выбор. После того, как вы создали там пустой репозиторий, добавьте его как удаленный локально:

Перед началом разработки рекомендуется убедиться, что у вас не возникнут проблемы из-за разных версий Python / пакетов. pipenv - мой любимый инструмент. На данный момент использование Python 3.8 является хорошей идеей (текущий статус поддержки версий Python).

Форматирование

С помощью упомянутого шаблона cookiecutter форматирование в значительной степени уже обработано:

  • black - Самоуверенный форматтер, который уважает PEP8 и реализует много Flake8

  • isort - Сортирует импорт

Единственное, чего не хватает, - это форматировщик стиля строки документации. Мне очень нравится формат строки документации numpydoc.

Если вы хотите узнать больше о форматировании, я рекомендую прочитать мое руководство по стилю Python.

Модульное тестирование

Прежде чем приступить к тестированию приложения, вы должны решить, какую версию Python вы хотите поддерживать. Ориентация должна заключаться в том, какие версии CPython в настоящее время получают обновления безопасности (см. вопрос SO).

У Python есть несколько фреймворков для тестирования. Используйте pytest. Он чрезвычайно распространен, стабилен и очень прост в использовании.

Шаблон cookiecutter устанавливает несколько полезных плагинов:

  • pytest-cov - Создает отчет о тестовом покрытии. Это поможет вам определить разделы, в которых ошибки не могут быть обнаружены модульным тестом.

  • pytest-black - Проверяет, был ли нанесен черный цвет.

  • pytest-flake8 - Еще один тест на форматирование.

  • pytest-mccabe - Убедитесь, что часть вашего кода не слишком сложна.

Вы также можете попробовать mutmut. Это может помочь вам определить, какие строки были проверены, но, возможно, недостаточно тщательно.

Чтобы запустить все ваши тесты, выполните tox.

Документация

Если вы разрабатываете библиотеку, вам нужна документация. Для других типов приложений не так много.

Лучшими инструментами являются Sphinx как генератор документации и readthedocs.org как хостинговые платформы.

Безопасность

Если вы разрабатываете приложение, вам необходимо обязательно обновить свои зависимости в случае возникновения уязвимостей. Пакет bandit и сервисы snyk.io / pyup.io могут помочь вам обнаружить такие случаи.

Версии

Хорошая практика - сделать доступным [module].__version__. Конечно, она должна быть такой же, как и версия, которую вы видите через pip freeze. И тогда было бы неплохо, если бы git commit имел тег git.

Конечно, все это можно сделать вручную. Если вам нужен инструмент, bumpversion довольно широко распространен. Однако это не поддерживается. Поэтому некоторые люди используют bump2version. Я не уверен, что буду использовать это.

Структура проекта

Файлы setuptools

Если у вас есть описанная структура проекта, то упаковка не имеет большого значения.

setup.py

Убедитесь, что на нем есть как минимум

setup.cfg

setup.cfg читается setuptools.setup (). Он может содержать много чего, но минимальный будет выглядеть так:

Создание раздачи

Создайте исходный файл дистрибутива:

Создайте раздачу wheel:

Публикация пакета

После создания загрузите его в PyPI с помощью twine.

Для этого сначала настройте файл ~/.pypirc:

Теперь вы можете загрузить созданные ранее дистрибутивы:

Также существует python setup.py upload. Некоторое время он не использовал https. Хотя это изменилось, стандартом де-факто по-прежнему является twine. По этим причинам.

Модули управления пакетами

distutils

Не рекомендуется. Используйте setuptools.

distribute

Это был форк setuptools, который снова объединили. Используйте setuptools.

setuptools

setuptools используется в setup.py и дает вам множество команд:

Форматы распространения пакетов

Есть 3 распространенных формата:

  • Source distributions

  • Egg

  • Wheel

Egg устарел и может быть заменен либо исходным кодом, либо wheel (источник).

Менеджер пакетов

PIP - это сокращение от «PIP устанавливает Python». Используй это. Не используйте easy_install.

Команды PIP

Смотрите также

Прочие материалы по упаковке:

Last updated

Was this helpful?