Все библиотеки 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
Поместите в него:
<!DOCTYPE html>
<html lang="en">
<head>
<title>{% block title %}My Site{% endblock %}
{% block css %}
{% endblock %}
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
Hello, world!
</body>
</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.
- Загрузите код согласно предыдущему разделу.