Библиотека сайта rus-linux.net
Архитектура системы управления пакетами в Python
Глава 14 из 1 тома книги "Архитектура приложений с открытым исходным кодом".
Оригинал: Python Packaging
Автор: Tarek Ziade
Дата публикации: 7 Июня 2012 г.
Перевод: А.Панин
Дата публикации перевода: 3 апреля 2013 г.
Creative Commons. Перевод был сделан в соответствие с лицензией Creative Commons. С русским вариантом лицензии можно ознакомиться здесь.
14.4. Усовершенствованные стандарты
14.4.3. Архитектурные решения в отношении работы с файлами данных
Как описывалось ранее, нам необходимо предоставить возможность принятия решений о местах размещения файлов данных ответственным за создание пакетов лицам, при этом их действия не должны приводить к неработоспособности кода. В то же время разработчик должен иметь возможность работы с файлами данных, не беспокоясь о их размещении. Наше решение является обычным применением обходных путей.
Использование файлов данных
MPTools требуется использовать конфигурационный файл. Разработчик должен поместить этот файл в пакет Python и использовать переменную __file__ для доступа к нему:
import os here = os.path.dirname(__file__) cfg = open(os.path.join(here, 'config', 'mopy.cfg'))
Подразумевается, что конфигурационные файлы устанавливаются аналогично файлам с кодом и разработчик обязан разместить эти файлы вместе с кодом: в этом примере в поддиректории с именем config.
pkgutil.open:
import os
import pkgutil
# Открыть файл, расположенный в директории config/mopy.cfg проекта MPTools
cfg = pkgutil.open('MPTools', 'config/mopy.cfg')
pkgutil.open получает доступ к метаданным проекта и проверяет наличие файла RESOURCES. В этом файле находится простой список соответствия для имен файлов и возможных мест их расположения в системе:
config/mopy.cfg {confdir}/{distribution.name}
В данном случае переменная {confdir} указывает на системную директорию для файлов конфигурации, а переменная {distribution.name} содержит имя проекта Python, извлеченное из метаданных.
Рисунок 14.4: Поиск файла
Как только данный файл метаданных RESOURCES создается во время установки, у разработчика появляется возможность с помощью API узнать о расположении файла mopy.cfg. И так как путь config/mopy.cfg относится к дереву директорий проекта, появляется возможность для реализации режима разработчика, в котором метаданные для проекта генерируются в директории проекта и путь к ним добавляется в список директорий поиска pkgutil.
Объявление файлов данных
setup.cfg. Сопоставление является списком кортежей формата (шаблон в формате glob, целевой путь). Каждый шаблон соответствует одному или нескольким файлам в дереве проекта, а целевой путь указывает путь для установки и может содержать переменные в фигурных скобках. Например, файл setup.cfg проекта MPTools может выглядеть подобным образом:
[files]
resources =
config/mopy.cfg {confdir}/{application.name}/
images/*.jpg {datadir}/{application.name}/
В модуле sysconfig объявлен и документирован список специальных переменных, которые могут быть использованы, а также их значения по умолчанию для каждой из платформ. Например, значением переменной {confdir} является строка /etc в Linux. Таким образом, установщики могут использовать это сопоставление вместе с модулем sysconfig во время установки для получения путей для копирования файлов. В конечном счете, установщики будут генерировать упоминавшийся ранее файл RESOURCES в составе метаданных и, таким образом, расположение этих файлов сможет быть установлено впоследствии с помощью функций модуля pkgutil.
Рисунок 14.5: Установщик
Далее: 14.4.4. Усовершенствования каталога PyPI
