2012-06-27 27 views
10

Ho una libreria Python che, oltre ai normali moduli Python, ha alcuni file di dati che devono andare in /usr/local/lib/python2.7/dist-package/mylibrary.setup.py non installa file di dati

Purtroppo, non sono riuscito a convincere setup.py a installare effettivamente i file di dati. Si noti che questo comportamento è in fase di installazione, non di sdist.

Ecco una versione leggermente redatto di setup.py

module_list = list_of_files 

setup(name   ='Modules', 
     version  ='1.33.7', 
     description ='My Sweet Module', 
     author  ='PN', 
     author_email ='email', 
     url   ='url', 
     packages  = ['my_module'], 

# I tried this. It got installed in /usr/my_module. Not ok. 

     # data_files = [ ("my_module", ["my_module/data1", 
     #         "my_module/data2"])] 

# This doesn't install it at all. 
     package_data = {"my_module" : ["my_module/data1", 
            "my_module/data2"] } 
    ) 

Questo è in Python 2.7 (dovrà essere eseguito in 2,6 alla fine), e dovrà funzionare su alcuni Ubuntu tra 10.04 e 12 anni. Sviluppandolo adesso il 12.04.

risposta

4

http://docs.python.org/distutils/setupscript.html#installing-additional-files

Se directory è un percorso relativo , viene interpretato come relativo al prefisso installazione (sys.prefix di Python pacchetti puro Python, sys.exec_prefix per i pacchetti che contengono moduli di estensione).

Questo sarà probabilmente farlo:

data_files = [ ("my_module", ["local/lib/python2.7/dist-package/my_module/data1", 
           "local/lib/python2.7/dist-package/my_module/data2"])] 

o semplicemente usare iscriverti per aggiungere il prefisso:

data_dir = os.path.join(sys.prefix, "local/lib/python2.7/dist-package/my_module") 
data_files = [ ("my_module", [os.path.join(data_dir, "data1"), 
           os.path.join(data_dir, "data2")])] 
+0

Hmmm. Riluttante a hardcode il percorso in, ma che potrebbe servire per ora. –

+4

Ho usato distutils.sysconfig.get_python_lib() + "path" e l'ho usato come chiave. –

+0

Questo non è il modo corretto per farlo. 'data_files' è per i file che vuoi mettere in/usr (ad es. icone, file .desktop, ecc.). Se vuoi includere i dati insieme al tuo modulo Python usi 'package_data' insieme al flag' include_package_data = True'. – Grumbel

13

UPD: package_data accetta dict in formato {'package': ['list', 'of?', 'globs*']}, in modo da rendere funziona, si dovrebbero specificare i glob di shell relativi alla dir del pacchetto, non i percorsi dei file relativi alla radice di distribuzione.

data_files ha un significato diverso e, in generale, si dovrebbe evitare di utilizzare questo parametro.

Con setuptools avete solo bisogno include_package_data=True, ma i file di dati dovrebbe essere sotto sistema di controllo di versione, noto a setuptools (di default riconosce solo CVS e SVN, installare setuptools-git o setuptools-hg se si utilizza git o hg ...)


con setuptools è possibile:

- in MANIFEST.im:

include my_module/data* 

- in setup.py:

setup(
     ... 
     include_package_data = True, 
     ... 
    ) 
+0

hm. questo è un po 'corto. Puoi approfondire ciò che le rispettive azioni causano? E devo fare entrambe le cose o l'una o l'altra? –

+0

https://pythonhosted.org/setuptools/setuptools.html # including-data-files – podshumok

+0

Questo è il metodo che ha funzionato indipendentemente dalla piattaforma. Quando ho usato la risposta accettata ha funzionato su Mac OS, ma su una VM Linux i file di dati sono stati copiati in posti strani. –

Problemi correlati