2011-05-05 20 views
26

En setup.py, he especificado package_data así:¿Cómo uso los datos en package_data desde el código fuente?

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

Y mi estructura de directorios es más o menos

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

El problema es que necesito para usar los archivos del directorio de plantillas en mi fuente código para que pueda escribir el código python (este proyecto es un generador de analizador). Parece que no puedo entender cómo incluir y usar estos archivos de mi código correctamente. ¿Algunas ideas?

Respuesta

33

El estándar pkgutil module's get_data() function calculará la ruta de acceso a sus datos, en relación con su paquete, y recuperar los datos para usted a través de cualquier cargador de módulos de Python utiliza para importar el hermes paquete:

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

Por supuesto, en ciertos casos solo podría leer sus datos usando una ruta calculada desde hermes.__file__, pero si planea distribuir su proyecto, considere que puede instalarse de diferentes maneras en la máquina del usuario final: como archivos simples, desplegados en un archivo de huellas comprimido, etc. En este último caso, su módulo hermes habrá sido importado por Python usando un zipimporter, evitando ou de hacer una normal de 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"> 

Si estás bien con la adición de una dependencia de tiempo de ejecución sobre la base de código distribute, es posible que desee consdider mirando el pkg_resources module, que le puede dar el mismo resultado, pero añade otras capacidades .

import pkg_resources 
data = pkg_resources.resource_string('hermes', 'templates/python.tpl') 
+4

uno puede usar 'nombre de módulo en lugar especificando __name__' directamente, por lo tanto' de datos = pkg_resources.resource_string ('Hermes', 'templates/python.tpl') '' se convierte en datos = pkg_resources.resource_string (__ name__, ' templates/python.tpl ') ' – b1r3k

Cuestiones relacionadas