Как использовать данные в 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')