Как использовать данные в package_data из исходного кода?

В setup.py, я указал package_data следующим образом:

packages=['hermes'],
package_dir={'hermes': 'hermes'},
package_data={'hermes': ['templates/*.tpl']},

И моя структура каталогов примерно

hermes/
 |
 | docs/
 | ...
 | hermes/
    | 
    | __init__.py
    | code.py
    | templates
        |
        | python.tpl
 |
 | README
 | setup.py

Проблема в том, что мне нужно использовать файлы из каталога шаблонов в моем исходном коде, чтобы я мог написать код Python (этот проект является генератором парсера). Я не могу понять, как правильно включать и использовать эти файлы из моего кода. Есть идеи?

1 ответ

Решение

Стандартный модуль pkgutil's get_data() Функция рассчитает путь к вашим данным относительно вашего пакета и извлечет данные для вас через любой загрузчик модулей Python, используемый для импортаhermesпакет:

import pkgutil
data = pkgutil.get_data('hermes', 'templates/python.tpl')

Конечно, в некоторых случаях вы можете просто прочитать ваши данные, используя путь, рассчитанный из hermes.__file__, но если вы планируете распространять свой проект, учтите, что он может быть установлен по-разному на компьютере конечного пользователя: в виде простых файлов, развернутых в архиве с архивированными яйцами и т. д. В последнем случае ваш hermesмодуль будет импортирован Python с использованиемzipimporter, мешая вам делать нормальныйopen(path).read():

>>> import hermes
>>> hermes.__loader__
<zipimporter object "/home/pat/.cascade/virt/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg">

Если вы в порядке с добавлением зависимости времени выполнения наdistributeкодовая база, вы можете рассмотреть, глядя наpkg_resources module, который может дать вам тот же результат, но добавляет другие возможности.

import pkg_resources
data = pkg_resources.resource_string('hermes', 'templates/python.tpl')
Другие вопросы по тегам