2013-01-08 8 views
5

To powinno być bardzo częste pytanie dla programistów, którzy użyli "setup.py" do budowania pakietów instalacyjnych i powinien on zostać zapytany wcześniej, ale nigdzie nie mogłem znaleźć właściwej odpowiedzi.Dowolna funkcja pythona, aby uzyskać katalog główny "data_files"?

W setup.py

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

Wynik sudo python setup.py zainstalować

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 

z obserwacji stosując powyższy wynik "/ usr/local" jest katalog główny "data_files". Czy oprócz funkcji hardcoding istnieją jakieś funkcje Pythona, które mogą dać mi ten katalog główny "data_files"?

Z sugestią Martijn Pieters, tu jest moje rozwiązanie

W setup.py

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

Wykorzystanie

import pkg_resources 

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

Odpowiedz

6

Domyślnie, po zainstalowaniu pakietu jako root, ścieżka danych jest oparta na sys.prefix plus nazwa twojego projektu, jak sądzę, dzięki czemu możesz na tej podstawie pobierać pliki.

Lepiej byłoby użyć rozszerzenia setuptools do distutils i użyć pkg_resources module Resource API do załadowania plików danych. Pochodzi z setuptools w tym właśnie celu.

Chcesz, aby twoje pliki danych zawarte w paczce działały najlepiej. Zobacz Including data files (w dokumentacji setuptools).

Następnie można załadować pliki z zasobów prosto do łańcucha z resource_string na przykład:

from pkg_resources import resource_string 

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

Obecnie używam „setup” z „distutils”. Sprawdzanie, czy Twoje rozwiązanie może mi pomóc, może trochę potrwać :) –

+0

@JessadaThutkawkorapin: Przejście na "setuptools" jest dość łatwe. :-) Jest wstecznie kompatybilny z 'distutils' i zdecydowanie godny polecenia! –

+0

Podczas gdy szukałem różnicy między disutils i setuptools, znalazłem http://stackoverflow.com/questions/6344076/differences-between-distribute-distutils-and-setuptools. Z tego, co z grubsza czytałem, wynika, że ​​sugestia zmierzała w kierunku disutils2. Czy nadal polecasz setuptools? –

Powiązane problemy