Как мне использовать данные в package_data из исходного кода? - PullRequest
30 голосов
/ 05 мая 2011

В 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 Ответ

38 голосов
/ 05 мая 2011

Стандартная функция get_data() * * * * * модуля * pkgutil вычислит путь к вашим данным относительно вашего пакета и получит данные для вас через любой загрузчик модулей 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')
...