2013-01-08 20 views
5

Questa dovrebbe essere una domanda molto comune per gli sviluppatori che hanno utilizzato "setup.py" per creare pacchetti di installazione e che dovrebbe essere richiesto prima, ma non sono riuscito a trovare la risposta corretta da nessuna parte.Qualsiasi funzione python per ottenere la directory radice "data_file"?

In setup.py

from distutils.core import setup 
setup(
    ...., 
    ...., 
    data_files=[('MyApp/CBV', ['myapp/data/CBV/training.cbv', 'myapp/data/CBV/test.cbv'])], 
    ...., 
    ...., 
    ) 

Risultato di sudo python setup.py install

running install 
running build 
running build_py 
running build_scripts 
running install_lib 
running install_scripts 
running install_data 
creating /usr/local/MyApp/CBV 
copying MyApp/data/CBV/training.cbv -> /usr/local/MyApp/CBV 
copying MyApp/data/CBV/test.cbv -> /usr/local/MyApp/CBV 
running install_egg_info 
Removing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info 
Writing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info 

Dall'osservazione con il risultato di cui sopra, "/ usr/local" è la directory root "data_files". Oltre alla codifica, esistono alcune funzioni Python che possono darmi questa directory root "data_files"?

Con suggerimento da Martijn Pieters, ecco la mia soluzione

In setup.py

from setuptools import setup 
setup(
    ...., 
    ...., 
    package=['myapp'], 
    package_data={'': ['data/CBV/*.cbv']}, 
    ...., 
    ...., 
    ) 

Uso

import pkg_resources 

my_data_file = pkg_resources.resource_filename(__name__, 'data/CBV/test.cbv') 
print my_data_file 

risposta

6

Per impostazione predefinita, quando si installa un pacchetto come root, il percorso dei dati è basato su sys.prefix più il nome del tuo progetto, credo, così puoi recuperare i tuoi file basandoti su quello.

Sarebbe meglio usare l'estensione setuptools su distutils e utilizzare pkg_resources module Resource API per caricare i file di dati. Viene fornito con setuptools per questo scopo.

Si desidera che i file di dati inclusi nel pacchetto per farlo funzionare al meglio. Vedi Including data files (nella documentazione di setuptools).

È quindi possibile caricare file di risorse con dritto in una stringa con resource_string ad esempio:

from pkg_resources import resource_string 

foo_config = resource_string(__name__, 'foo.conf') 
+0

Attualmente, sto usando "setup" da "distutils". Potrebbe volerci un po 'di tempo per verificare se la soluzione mi può aiutare :) –

+0

@JessadaThutkawkorapin: Passare a 'setuptools' è abbastanza facile. :-) È retrocompatibile con 'distutils', e decisamente raccomandabile! –

+0

Mentre cercavo la differenza tra disutils e setuptools, ho trovato http://stackoverflow.com/questions/6344076/differences-between-distribute-distutils-and-setuptools. Da quanto ho letto, sembra che il suggerimento fosse rivolto ai disutils2. Raccomandi ancora setuptools? –

Problemi correlati