È possibile utilizzare la libreria pkg_resources
fornita con setuptools
.
Per esempio, ho fatto un piccolo pacchetto rapido "proj"
per illustrare lo schema di organizzazione delle risorse userei:
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
Notate come continuo a tutte le risorse in un sottopacchetto separata.
"code.py"
mostra come pkg_resources
viene utilizzato per fare riferimento agli oggetti di risorse:
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')
Se lo si esegue, si ottiene:
['__init__.py', '__init__.pyc', 'pic1.png', 'pic2.png']
iVBORw0KGgoAAAANSUhE ...
Se è necessario trattare una risorsa come FileObject, utilizzare resource_stream()
.
Il codice che accede alle risorse può essere ovunque all'interno della struttura del sottopacchetto del progetto, è sufficiente fare riferimento al pacchetto parziale contenente le immagini con il nome completo: proj.resources.images
, in questo caso.
Ecco "setup.py"
:
#!/usr/bin/env python
from setuptools import setup, find_packages
setup(name='proj',
packages=find_packages(),
package_data={'': ['*.png']})
Caveat: per verificare le cose "a livello locale", che è w/o l'installazione del primo pacchetto, dovrete richiamare i vostri script di test dalla directory che ha setup.py
. Se ti trovi nella stessa directory di code.py
, Python non saprà del pacchetto proj
. Quindi cose come proj.resources
non risolveranno.
Bene, qui gli svantaggi sono troppo. Non esiste un modo semplice e intelligente per mettere insieme le risorse con i progetti Python? –
So solo 2 modi ampiamente supportati (non è semplice): 1) 'distutils'-way (standard): la documentazione lascia l'accesso ai file di risorse come esercizio per il lettore (probabilmente perché pensano che le manipolazioni del percorso relativo a '__file__' sono tutti necessari). 2) 'setuptools'-way (superset di' distutils'), descritto sopra. –