Подтвердить что ты не робот

Как использовать данные в 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 (этот проект является генератором синтаксического анализатора). Я не могу понять, как правильно включать и использовать эти файлы из моего кода. Любые идеи?

4b9b3361

Ответ 1

Стандартная функция pkgutil module 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')