Пакеты в python (дополнение)

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

При использовании setuptools есть несколько путей, как это сделать. Самый простой - использовать директиву include_package_data:

from setuptools import setup, find_packages
setup(
    ...
    include_package_data=True
)

Эта директива указывает включить в пакет все файлы данных. Файлы данных должны быть или под управлением CSV или Subversion, или быть описаны в MANIFEST.in. При использовании других VS придеться озадачиться поиском плагинов. Т.к. в работе я использую GIT, то мне удобнее вариант с MANIFEST.in.

Формат файла MANIFEST.in можно посмотреть в документации. Если кратко, то это командный файл, в котором каждая строка - команда включения файлов по маске или исключения. Например:

include *.txt
recursive-include data *.dat
prune data/test?/build

Основные команды:

  • include pat1 pat2 ... включить все файлы, попадающие под паттерн
  • exclude pat1 pat2 ... исключить все файлы, попадающие под паттерн
  • recursive-include dir pat1 pat2 ... включить рекурсивно все файлы в директории, попадающие под паттерн
  • recursive-exclude dir pat1 pat2 ... исключить рекурсивно все файлы в директории, попадающие под паттерн
  • global-include pat1 pat2 ... включить все файлы в глобальном дереве, попадающие под паттерн
  • global-exclude pat1 pat2 ... исключить все файлы в глобальном дереве, попадающие под паттерн
  • prune dir исключить все файлы в директории
  • graft dir включить все файлы в директории

Рассмотрим в качестве примера добавление переводов в наш проект:

the-sample-project
|-- sample_project
|       |--locale
|       |     |--ru
|       |         |--LC_MESSAGES
|       |              |--django.mo
|       |              |--django.po
|       |-- __init__.py
|       |-- core.py
|-- setup.py

Для того, чтоб включить в проект наш перевод, создадим файл MANIFEST.in в корне проекта рядом с файлом setup.py

recursive-include sample_project/locale *.po *.mo

И изменим немного setup.py

from setuputils import setup, find_packages
from os.path import join, dirname

setup(
    name="sample_project",
    version="1.0",
    packages=find_packages(),
    long_description=open(join(dirname(__file__), "README.txt")).read(),
    entry_points={
        "console_scripts":
            ["sample_project = sample_project.core:print_current_time"]
    },
    include_package_data=True
)

Можно также более детально описывать что включать, а что исключать из пакета, уже в самом setup.py. Для этого есть директивы package_data и exclude_package_data. Более подробно в документации.

 
comments powered by Disqus