Es posible que desee utilizar la biblioteca pkg_resources
que viene con setuptools
.
Por ejemplo, he hecho un pequeño paquete rápida "proj"
para ilustrar el esquema de organización de recursos que haría uso:
proj/setup.py
proj/proj/__init__.py
proj/proj/code.py
proj/proj/resources/__init__.py
proj/proj/resources/images/__init__.py
proj/proj/resources/images/pic1.png
proj/proj/resources/images/pic2.png
Observe cómo guardo todos los recursos en un sub-paquete separado.
"code.py"
muestra cómo pkg_resources
se utiliza para referirse a los objetos de recursos:
from pkg_resources import resource_string, resource_listdir
# Itemize data files under proj/resources/images:
print resource_listdir('proj.resources.images', '')
# Get the data file bytes:
print resource_string('proj.resources.images', 'pic2.png').encode('base64')
Si lo ejecuta, se obtiene:
['__init__.py', '__init__.pyc', 'pic1.png', 'pic2.png']
iVBORw0KGgoAAAANSUhE ...
Si necesita tratamiento para un recurso como un FileObject, usa resource_stream()
.
El código de acceso a los recursos puede estar en cualquier lugar dentro de la estructura del subpaquete de su proyecto, solo necesita hacer referencia al subpaquete que contiene las imágenes por nombre completo: proj.resources.images
, en este caso.
Aquí es "setup.py"
:
#!/usr/bin/env python
from setuptools import setup, find_packages
setup(name='proj',
packages=find_packages(),
package_data={'': ['*.png']})
Advertencia: Para probar cosas "local", es decir w/o instalar el paquete en primer lugar, usted tiene que invocar los scripts de prueba a partir de directorio que tiene setup.py
. Si está en el mismo directorio que code.py
, Python no sabrá sobre el paquete proj
. Por lo tanto, cosas como proj.resources
no se resolverán.
Bueno, las desventajas aquí son demasiado. ¿No hay una forma sensata y simple de empacar recursos con proyectos de Python? –
Conozco solo 2 formas ampliamente compatibles (lamentablemente no son simples): 1) 'distutils'-way (estándar): la documentación deja el acceso a los archivos de recursos como un ejercicio para el lector (probablemente porque piensan en la manipulación de rutas) relativo a '__file__' son todo lo que uno necesita). 2) 'setuptools'-way (superconjunto de' distutils'), descrito anteriormente. –