Jak wykorzystać dane w pakiecie Dane z kodu źródłowego?

W setup.py, podałem package_data TAK:

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

A moja struktura katalogów to mniej więcej

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

Problem polega na tym, że muszę użyć plików z katalogu templates w kodzie źródłowym, aby móc napisać kod Pythona (ten projekt jest generatorem parserów). Nie wiem, jak poprawnie załączyć i użyć tych plików z mojego kodu. Jakieś pomysły?

Author: Scott, 2011-05-05

1 answers

Standardowa Funkcja get_data() modułu pkgutil obliczy ścieżkę do Twoich danych względem Twojego pakietu i pobierze dane za pośrednictwem dowolnego modułu ładującego Python używanego do importowania hermes pakietu:

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

Oczywiście w niektórych przypadkach można po prostu odczytać dane za pomocą ścieżki obliczonej z hermes.__file__, ale jeśli planujesz dystrybucję swojego projektu, weź pod uwagę, że może on być instalowany na różne sposoby na komputerze użytkownika końcowego: jako zwykłe pliki, wdrożone w zapinane na zamek archiwum jaj itp. W tym drugim przypadku twój hermes moduł zostanie zaimportowany przez Pythona przy użyciu zipimporter, co uniemożliwia wykonanie normalnego 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">

Jeśli nie masz nic przeciwko dodaniu zależności runtime od bazy kodowej distribute, możesz chcieć sprawdzićpkg_resources module, co może dać ten sam wynik, ale dodaje inne możliwości.

import pkg_resources
data = pkg_resources.resource_string('hermes', 'templates/python.tpl')
 35
Author: samplebias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-05 14:43:32