Пакетирование и дистрибуция приложений Python

Все библиотеки Python (т.е. пакеты прикладных программ), которые вы загружаете при помощи менеджера пакетов (например, PIP), распределяются с помощью специальной утилиты. Такие утилиты создают дистрибутивы Python; по сути, это сжатые версированные архивы, содержащие все связанные элементы, например, исходные и ресурсные файлы.

Данное руководство рассказывает о важных инструментах для дистрибуции приложений и ключевых этапах пакетирования библиотек, модулей и приложений. Это поможет развернуть собственный проект.

Дистрибутивы и пакеты Python

Даже пользователи с небольшим опытом работы с Python должны уметь использовать менеджер пакетов (например, pip, easy_install) для загрузки модулей и библиотек, которые в дальнейшем можно импортировать и использовать для создания нового приложения.

Эти инструменты управления пакетами при локальном использовании подключаются к исходникам и выполняют необходимое действие (установку, поиск и т.д.).

Для дистрибуции приложения нужно:

  • Упаковать каталог приложения, добавив в него необходимые и рекомендуемые файлы;
  • Указать элементы, связанные с приложением (зависимости, ресурсы и т.п.)
  • Выпустить релиз  приложения.

Примечание: В работе настоятельно рекомендуется использовать виртуальное окружение (virtualenv), позволяющее изолировать загрузки, модули и остальные компоненты определённого приложения Python.

Пакет Python технически являются импортируемым каталогом (с __init__.py), содержащим исходные файлы (модули). Не нужно путать их с пакетами операционной системы, которые технически являются приложениями.

Пример структуры пакета:

package
|
|-- __init__.py

 Приложения Python

В целом, приложение Python может состоять как из одного файла, так и из сотни. Но, как правило, оно содержит несколько модулей и определённое количество внешних файлов (из библиотек).

Пример структуры приложения:

myapp
|
|-- __init__.py
|-- amodule.py
|-- anothermod.py
|__ tests
|     |
|     |-- __init__.py
|     |-- ..
|     |-- .
| ..

Инструменты и библиотеки Python

Сегодня Python пользуется широкой популярностью, а потому для него разработано много сторонних библиотек и приложений, которые способны сделать процесс дистрибуции более простым и удобным.

Для управления дистрибуцией Python предлагает утилиту distutils.

Каталог пакетов Python

Python Package Index, чаще PyPI – это централизованный онлайн-репозиторий, предназначенный для проектов-дистрибутивов Python. Пакетные менеджеры (например, pip) используют этот репозиторий для хранения, поиска и установки необходимых дистрибутивов.

Для начала попробуем создать простое Python-приложение, которое потом можно пакетировать.

Структура приложения

Данное тестовое приложение будет иметь наиболее общую и распространённую структуру, дополненную несколькими модулями.

Пример структуры:

/MyApplication
|-- run.py
|-- config.py
|__ /app
|-- __init__.py
|-- /module_one
|-- __init__.py
|-- controllers.py
|-- models.py
|__ /templates
|-- module_one
|-- hello.html
|__ /static
|__ ..
|__ .

Создайте необходимые папки:

mkdir ~/MyApplication
cd    ~/MyApplication
touch run.py
touch config.py
mkdir app
cd    app
touch __init__.py
mkdir templates
mkdir static
mkdir module_one
cd    module_one
touch __init__.py
touch controllers.py
touch models.py
cd    ../templates
mkdir module_one
cd    module_one
touch hello.html

Отредактируйте run.py:

nano ~/MyApplication/run.py

Поместите в него следующий код:

# Run a test server.
from app import app
app.run(debug=True)

Сохраните и закройте файл (CTRL+X, Y).

Затем откройте в текстовом редакторе config.py:

nano ~/MyApplication/config.py

Вставьте в него следующий код:

DEBUG = True
THREADS_PER_PAGE = 4
CSRF_ENABLED     = True
CSRF_SESSION_KEY = "secret"

Сохраните и закройте файл (CTRL+X, Y).

Откройте файл app/init.py в текстовом редакторе:

nano ~/MyApplication/app/__init__.py

Добавьте в него код:

from flask import Flask, render_template
app = Flask(__name__)
app.config.from_object("config")
from app.module_one.controllers import module_one
app.register_blueprint(module_one)

Сохраните и закройте файл.

Откройте app/module_one/controllers.py в текстовом редакторе:

nano app/module_one/controllers.py

Добавьте в файл следующий контент:

from flask import Blueprint, request, render_template
module_one = Blueprint("auth", __name__, url_prefix="/auth")
@module_one.route("/hello")
def hello():
return render_template("module_one/hello.html")

Сохраните и закройте файл.

Откройте в редакторе файл app/templates/module_one/hello.html:

nano app/templates/module_one/hello.html

Поместите в него:

&lt!DOCTYPE html>
&lthtml lang="en">
&lthead>
&lttitle>{% block title %}My Site{% endblock %}
{% block css %}
{% endblock %}
&ltmeta name="viewport" content="width=device-width, initial-scale=1.0">
&lt/head>
&ltbody>
Hello, world!
&lt/body>
&lt/html>

Сохраните и закройте файл (CTRL+X, Y).

Тестовое приложение готово.

Дистрибуция и пакетирование приложения

Теперь на сервере есть простое приложение, основанное на flask, которое можно подготовить к дистрибуции.

Редактирование структуры папок

Чтобы пакетирование приложения прошло успешно, нужно внести некоторые поправки в структуру папок.

/MyApplication
|-- run.py
|__ /app
|-- __init__.py
|-- /module_one
|-- __init__.py
|-- controllers.py
|-- models.py
|__ /templates
|-- module_one
|-- hello.html
|__ /static
|__ ..
|__ .
|-- setup.py    # Distribution setup file
|-- README.txt  # Read-me file
|-- MANIFEST.in # Distribution manifest file
|-- CHANGES.txt # Changes log

После этого нужно создать дополнительные файлы:

touch ~/MyApplication/setup.py
touch ~/MyApplication/README.py
touch ~/MyApplication/MANIFEST.py
touch ~/MyApplication/CHANGES.py
mv    ~/MyApplication/run.py ~/MyApplication/bin/run

Создайте файл setup.py:

nano ~/MyApplication/setup.py

Добавьте в него такой код:

from distutils.core import setup
setup(
# Application name:
name="MyApplication",
# Version number (initial):
version="0.1.0",
# Application author details:
author="name surname",
author_email="name@addr.ess",
# Packages
packages=["app"],
# Include additional files into the package
include_package_data=True,
# Details
url="http://pypi.python.org/pypi/MyApplication_v010/",
#
# license="LICENSE.txt",
description="Useful towel-related stuff.",
# long_description=open("README.txt").read(),
# Dependent packages (distributions)
install_requires=[
"flask",
],
)

Сохраните и закройте файл.

Создание MANIFEST.in

При необходимости внести в пакет приложения дополнительные каталоги (статические файлы или шаблоны) укажите их в MANIFEST.in, после чего они будут упакованы.

nano ~/MyApplication/MANIFEST.in

Добавьте в файл строки:

recursive-include app/templates *
recursive-include app/static *

Сохраните и закройте файл.

Теперь пакет дистрибутива Python готов к установке и отправке.

Дополнительные файлы

Помните, что для создания полного дистрибутива нужно добавить в файл/каталог и настроить поддержку следующих файлов:

  • README.txt
  • MANIFEST.in
  • LICENSE.txt

Работа с приложением, готовым к дистрибуции

На данном этапе приложение полностью готово к операции пакетирования.

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

Чтобы создать копию файла дистрибутива, запустите:

cd     ~/MyApplication
python setup.py sdist

Эта команда просмотрит настройку, выведет выполняемые операции и создаст архива внутри только что созданного каталога diet, что выглядит примерно так:

# root@hostname:~/MyApplication# ls dist
# MyApplication-0.1.0.tar.gz

Примечание: Поскольку не все подкаталоги и дополнительные файлы были ранее заполнены, на данном этапе может система может вернуть предупреждение.

Установка приложения

Теперь другие пользователи могут установить приложение при помощи файла setup.py.

Чтобы установить приложение, запустите:

python setup.py install

Если эта установка предназначена для разработки и не все зависимости установлены, введите:

python setup.py develop

Распространение приложения

Чтобы поделиться своим кодом в Python Packaging Index, используйте команду register:

python setup.py register

После запуска команды следуйте инструкциям на экране.

Если у вас уже есть учётная запись, используйте следующую команду, чтобы просто выгрузить код:

python setup.py sdist upload

Создание пакета новой версии приложения

  • Отредактируйте файл setup.py и укажите новый номер версии:

version="0.1.1"

  • Отразите изменения в файле CHANGES.txt.
  • Внесите соответствующие коррективы в LICENSE.txt и README.txt.
  • Загрузите код согласно предыдущему разделу.
Tags: ,

Добавить комментарий