2012-06-27 17 views
10

Tengo una biblioteca de Python que, además de los módulos regulares de Python, tiene algunos archivos de datos que deben ir en /usr/local/lib/python2.7/dist-package/mylibrary.setup.py no instala los archivos de datos

Desafortunadamente, no he podido convencer a setup.py de que realmente instale los archivos de datos allí. Tenga en cuenta que este comportamiento está bajo instalación, no sdist.

Aquí es una versión ligeramente redactada del 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"] } 
    ) 

Esto está en Python 2.7 (tendrá que ejecutar en 2,6 con el tiempo), y tendrá que ejecutar en algunos Ubuntu entre 10,04 y 12+. Desarrollando ahora en 12.04.

Respuesta

4

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

Si el directorio es una ruta relativa, se interpreta en relación con el prefijo instalación (sys.prefix de Python para paquetes de Python puro, sys.exec_prefix paquetes que contienen módulos de extensión)

Esto probablemente hacerlo:

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

o simplemente utilizar unirse a añadir el prefijo:

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. Renuente a codificar el camino, pero eso podría servir por ahora. –

+4

Utilicé distutils.sysconfig.get_python_lib() + "ruta" y lo usé como clave. –

+0

Esta no es la forma correcta de hacerlo. 'data_files' es para los archivos que desea colocar en/usr (por ejemplo, iconos, archivos .desktop, etc.). Si desea incluir datos junto con su módulo de Python, use 'package_data' junto con el indicador' include_package_data = True'. – Grumbel

13

UPD: package_data acepta dict en formato {'package': ['list', 'of?', 'globs*']}, así que para hacer Funciona, uno debe especificar componentes del shell relativos al directorio del paquete, no las rutas del archivo relativas a la raíz de la distribución.

data_files tiene un significado diferente, y, en general, uno debe evitar el uso de este parámetro.

Con setuptools sólo se necesita include_package_data=True, pero los archivos de datos debe estar bajo control de versiones, se sabe que setuptools (por defecto se reconoce sólo CVS y SVN, instalar o setuptools-gitsetuptools-hg si utiliza git o hg ...)


con setuptools puede:

- en MANIFEST.im:

include my_module/data* 

- en setup.py:

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

hm. esto es un poco corto. ¿Puedes dar más detalles sobre lo que causan las acciones respectivas? ¿Y tengo que hacer las dos cosas o cualquiera de ellos? –

+0

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

+0

Este es el método que funcionó independientemente de la plataforma. Cuando utilicé la respuesta aceptada, funcionó en Mac OS, pero en una máquina virtual Linux, los archivos de datos se copiaron en lugares extraños. –

Cuestiones relacionadas