Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Дмитрий Федосеев. Практика использования setuptools

Дмитрий Федосеев. Практика использования setuptools

В своём докладе я расскажу как использовать пакет setuptools для подготовки ПО к распространению, использованию утилит easy_install и pip, приведу удачные примеры оформления ПО в виде пакетов.

Python Community Chelyabinsk

February 03, 2018
Tweet

More Decks by Python Community Chelyabinsk

Other Decks in Programming

Transcript

  1. Аргумент setup() - version 1. Обязательный аргумент. 2. Должен соответствовать

    PEP 440 -- Version Identification and Dependency Specification. 3. Используется для определения необходимости обновления. 4. Используется для решения конфликтов версий.
  2. Аргументы setup() - author и author_email 1. Необязательные аргументы. 2.

    Помогут прославиться. 3. Помогут вашей славе найти вас.
  3. Аргумент setup() - packages 1. Обязательный аргумент. 2. Содержит полный

    список устанавливаемых пакетов - вложенные пакеты не включаются автоматически. 3. Функция find_packages() помогает рекурсивно просматривать папки и искать в них пакеты. 4. Если код расположен в src/ - указать это в вызове find_packages(‘src’) и добавить к вызову setup аргумент package_dir:
  4. Аргумент setup() - package_data 1. Необязательный аргумент. 2. Позволяет добавить

    к пакету неисполняемые файлы - шаблоны, CSS, картинки. 3. Нельзя рекурсивно указать папки, нужно явно перечислить все вложенные папки.
  5. Аргумент setup() - install_requires 1. Необязательный аргумент. 2. Список пакетов,

    которые требуются для работы вашего пакета. 3. Можно указать требуемые версии.
  6. Аргумент setup() - entry_points 1. Необязательный аргумент. 2. Позволяет при

    установке пакета создать скрипты-обертки, вызывающие указанные функции модулей. 3. Скрипты создаются в папке $HOME/.local/bin (или /usr/local/bin) - их можно вызывать по короткому имени, так как они попадают в $PATH.
  7. pip install <URL> - откуда? 1. Из удаленного репозитория: pip

    install git+ssh://bitbucket.org/<user>/<repo> 2. Из локальной папки: pip install /home/<user>/<cloned-repo> 3. Из текущей папки: pip install . 4. Из текущей папки создать симлинк: pip install -e .
  8. pip install <URL> - куда? 1. Виртуальное окружение: размещение пакетов

    зависит от размещения окружения. pip install <package> easy_install <package> 2. Пакеты, установленные пользователем (PEP 370): $HOME/.local/lib/pythonX.X/site-packages/. pip install <package> easy_install <package> --user 3. Пакеты, локально установленные администратором: /usr/local/lib/pythonX.X/dist-packages/. sudo pip install <package> sudo easy_install <package> 4. Пакеты, установленные из репозитория ОС: /usr/lib/pythonX.X/dist-packages/ sudo apt install <deb package>. 5. Переменная окружения PYTHONPATH перечисляет дополнительные локации.
  9. Виртуальное окружение 1. Обычно полностью изолировано от прочих внешних источников

    пакетов. 2. Может ссылаться на внешние источники пакетов - указывается при создании окружения, но нет возможности выбора включаемых пакетов. 3. Вручную можно создать симлинки на пакеты из внешних источников. 4. При установке пакетов с бинарными зависимостями требуются средства для компиляции. 5. Решает конфликты версий пакетов в среде разработки. Использование в продуктивной среде избыточно - конфликт версий пакетов в рамках одной информационной системы является недопустимым дефектом проектирования системы.
  10. PEP 370 -- Per user site-packages directory 1. Пакеты имеют

    больший приоритет, чем установленные в /usr 2. Не требуется повышение привилегий доступа к файловой системе, установка выполняется пользователем. 3. При использовании easy_install и pip старых версий требуется указать ключ --user. 4. При использовании easy_install пакет не будет установлен, если подходящая версия уже установлена в системные папки. 5. При использовании pip пакет будет установлен, независимо от его наличия в системных папках. 6. Доступны только установившему их пользователю.
  11. Системно доступные пакеты. 1. Установка требует привилегий администратора. 2. Могут

    использоваться любым пользователем. 3. Пользователи не могут вносить изменения.
  12. Как правильно готовиться к развертыванию. 1. Создать учетные записи для

    каждой информ. системы. 2. virtualenv - лишний компонент. 3. Установить пакеты с бинарными зависимостями из репозитория ОС. 4. Подготовить пакет с указанием зависимостей в setup.py; пакеты п.3 исключить из setup.py (но не забывать). 5. Установить в домашнюю папку подготовленный пакет.
  13. Django: How to write reusable apps 1. Reusability matters 2.

    Проблема: приложения попадают в общее пространство имен и засоряют его. 3. Решение: namespace packages 4. Проблема: настройки приложений и проекта хранятся в общем репозитории - это небезопасно и неудобно при многократном развертывании. 5. Решение: разделить конфигурационные файлы и код.
  14. Namespace packages - концепция 1. Позволяют объединить приложения в общем

    пространстве имен. 2. Приложения разрабатываются и упаковываются независимо, но это не создает конфликта имен. 3. Пакет верхнего уровня всех приложений должен содержать единственный файл __init__.py с единственной строкой: __import__('pkg_resources').declare_namespace(__name__)
  15. Улучшаем manage.py 1. Создаем main() - будем использовать ее в

    console_scripts. 2. Меняем текущую папку - startapp будет создавать приложения в правильной папке.
  16. Django и setuptools - все вместе. 1. При создании проекта

    используется шаблон: django-admin startproject --template <template_dir> <project> 2. Шаблон по умолчанию находится в django/conf/project_template/ 3. Попробуйте другой шаблон - https://bitbucket.org/dmitryfedoseev/django-project-template 4. Поместите код во внешнее хранилище - git commit, git push.
  17. Установка из удаленного хранилища git. 1. pip install git+ssh://[email protected]/<user>/<repo> 2.

    cd /tmp git clone ssh://[email protected]:<user>/<repo> cd <repo> sudo -i -u <target account> pip install . 3. cd git clone ssh://[email protected]:<user>/<repo> cd <repo> pip install -e .