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?
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')
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