Створення python-пакетів (aka setup scripts)

Одна з справді корисних речей у python – це система скриптів установки. Будь-який розробник, що серйозно захоплюється python-програмуванням, рано чи пізно стикається з нею. Але через гнучкість інструментарію скриптів установки їх документація дуже роздута. На даний момент є набір утиліт (setuptools, distutils, distribute), що виконують однакові завдання.

проекту

У цій статті я на конкретних прикладах покажу як створити та налаштувати простий python-пакет.

Наш проект матиме таку функціональність:

  • Метод, що повертає рядок: "Hello World!";
  • Команда Helloworld друкує цей рядок у стандартний висновок.

Створюємо структуру проекту

Для початку створимо директорію для пакета. Її мінімальний набір файлів складається з: файлу дистриб'юції ( setup.py ), що описує метадані та python коду проекту (у нашому випадку модуля helloworld).

Також, гарним тоном вважається створення в корені директорії файлу з описом проекту: README.txt.

Отримуємо таку структуру:

Наша коренева директорія helloworld-project міститиме мета-дані пакета та допоміжні файли (тести, ліцензію, документацію тощо), а піддиректорія helloworld безпосередньо сам модуль helloworld.

Тепер відредагуємо файл: helloworld/core.py та додамо логіку нашої програми (отримання та виведення рядка "Hello World!"):

Редагуємо мета-інформацію (setup.py)

Заповнимо файл опису README.rst :

Тепер відредагуємо файл setup.py:

Переконайтеся, що у вашій системі доступні setuptools, інакше встановіть python-пакет distribute

Цих операцій достатньо, щоби зібрати пакет дистриб'юції. Виконайте команду збирання:

УУ разі успіху ви отримаєте файл: dist/helloworld-1.0.tar.gz . Це повноцінний, архівований python-пакет і ви можете розповсюджувати його серед інших розробників.

Віртуальне оточення

Virtualenv — пакет, який використовується для створення ізольованого python-оточення. Використовуємо її для тестування нашого проекту.

Створимо оточення env:

Команда створить директорію env всередині нашого проекту та встановить туди python, pip та distribute. Зробимо в нього встановлення нашого проекту.

І протестуємо його працездатність:

Все працює. Залишилося додати підтримку команди Helloworld в консолі.

Створення команд

Для створення команди helloworld змінимо файл setup.py:

У параметрі entry_points ми задаємо словник із "точками виклику" нашої програми. Ключ console_scripts задає список створюваних скриптів (у Windows це будуть exe-файли). В даному випадку ми вказали створення скрипта helloworld, що виконується, при викликі якого буде запускатися метод print_message з модуля helloworld.core.

Перевстановимо модуль у наше оточення і перевіримо роботу створеного скрипта (для цього доведеться активувати наше оточення):

Схоже, все працює.

Робота з версіями

Номер версії є важливою частиною будь-якого проекту. Від нього залежить оновлення пакетів та дозвіл залежностей. У прикладі вище ми вказали номер версії 1.0 у файлі setup.py. Більше правильне рішення перенести його у файл helloworld/__init__.py щоб зробити доступним у python-коді. За існуючими угодами для зберігання номера версії в модулі використовується змінна __version__.

Змінимо файл setup.py , щоб нам не доводилося редагувати номер версії у двох місцях:

Існує безліч систем найменування версій уPython зазвичай рекомендується використовувати PEP386. Можна припустити, що позначення версії складається з номера мажорного, мінорного релізів (номеру багфіксу за потреби), розділених крапками. В останній частині версії можна використовувати літери латинського алфавіту. Приклади з офіційної документації:

Управління залежностями

Додамо функціональності нашому проекту. Створимо команду serve, яка буде запускати вебсервер, що віддає сторінку з рядком "Hello world!" генерується нашим модулем. Для цього скористаємося пакетом Flask.

Додаємо файл helloworld/web.py :

І файл helloworld/templates/index.html:

І опишемо команду serve у файлі setup.py:

Тепер у нашому проекті з'явилася залежність від пакету Flask. Без його встановлення наша програма не буде правильно працювати. За опис залежностей файлу setup.py відповідає параметр install_requires:

Перевіримо встановлення залежностей оновивши наш пакет та роботу команди serve:

Керування файлами проекту (MANIFEST.in)

На даний момент при складанні нашого пакету distutils включає в нього тільки python-файли. Необхідно включити файл helloworld/templates/index.html без якого проект працювати не буде.

Щоб зробити це, ми повинні повідомити distutils які ще файли треба включати в наш проект. Одним із способів є створення файлу MANIFEST.in :

Ця команда вказує distutils на включення до проекту всіх html файлів у директорії helloworld/templates .

Також доведеться оновити setup.py:

Тепер шаблони будуть включені до нашого проекту.

Створення та запуск тестів

Хорошою практикою є створення тестів для вашого проекту. Додамо найпростішу реалізацію, файл tests.py :

І оновимо setup.py:

Тепер ми можемо провести попереднє тестування нашого проекту:

Зверніть увагу, що для запуску тестів навіть не потрібне створення віртуального оточення. Необхідні залежності будуть завантажені до директорії проекту у вигляді egg пакетів.

Публікація пакету на pypi.python.org