python packaging setuptools setup.py

Empaquetado de Python: los archivos de datos se colocan correctamente en el archivo tar.gz pero no se instalan en el entorno virtual



packaging setuptools (5)

No puedo instalar correctamente el proyecto package_fiddler en mi entorno virtual.

He descubierto que MANIFEST.in es responsable de poner los archivos Package_fiddler-0.0.0.tar.gz en Package_fiddler-0.0.0.tar.gz que se genera al ejecutar python setup.py sdist .

Entonces lo hice:

(virt_envir)$ pip install dist/Package_fiddler-0.0.0.tar.gz

Pero esto no instaló los archivos de datos ni el paquete en /home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages .

He intentado muchas configuraciones de los argumentos de configuración package_data , include_package_data y data_files pero parece que he usado la configuración incorrecta cada vez.

¿Qué configuración de package_data y / o include_package_data y / o data_files instalará correctamente data_files en mi entorno virtual?

Árbol de proyecto

. ├── MANIFEST.in ├── package_fiddler │   ├── data │   │   ├── example.html │   │   └── stylesheets │   │   └── example.css │   └── __init__.py ├── README.rst └── setup.py

setup.py

from setuptools import setup setup( name=''Package_fiddler'', entry_points={ ''console_scripts'': [''package_fiddler = package_fiddler:main'', ],}, long_description=open(''README.rst'').read(), packages=[''package_fiddler'',])

MANIFEST.in

include README.rst recursive-include package_fiddler/data *

¿Qué configuraciones de setup.py (con la base de código anterior) he intentado?

Configuración1

Agregar:

package_data={"": [''package_fiddler/data/*'',]}

Configuración2

Agregar:

package_data={"": [''*.html'', ''*.css'', ''*.rst'']}

Configuración3

Agregar:

include_package_data=True

Configuración4

Agregar:

package_data={"": [''package_fiddler/data'',]}

Eliminando:

packages=[''package_fiddler'',]

Configuración5 (sugerencia de Chris)

Agregar:

package_data={"data": [''package_fiddler/data'',]}

Eliminando:

packages=[''package_fiddler'',]

Configuración 6

Agregar:

package_data={"": [''package_fiddler/data/*'',]}

Eliminando:

packages=[''package_fiddler'',]

Todas estas configuraciones dan como resultado que no se instalen /home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages en /home/username/.virtualenvs/virt_envir/local/lib/python2.7/site-packages .

EDITAR

Nota para Toshio Kuratomi : En mi publicación original utilicé la estructura de árbol más simple donde ocurre este problema para mayor claridad, pero en realidad mi árbol se parece más al árbol de abajo. Para ese árbol, extrañamente si solo pongo un __init__.py en stylesheets de stylesheets alguna manera todos los archivos de datos en la carpeta de texts también están instalados correctamente. Esto me desconcierta.

Árbol 2 (¡Esto instala todos los archivos de datos de alguna manera!)

. ├── MANIFEST.in ├── package_fiddler │ │── stylesheets | | ├── __init__.py | | ├── example.css | | └── other | | └── example2.css | |__ texts | | ├── example.txt | | └── other | | └── example2.txt │ └── __init__.py ├── README.rst └── setup.py


Encontré una solución que funcionó para mí here .

Usando setuptools==2.0.2 lo hice:

setuptools.setup( ... packages=setuptools.find_packages(), include_package_data=True, # use MANIFEST.in during install ... )


Esto funciona para mí Espero eso ayude.

package_data={ "package_fiddler": [ ''/*./*'', ''/*//*./*'', ''/*//*//*./*'', ], },


La forma más fácil de incluir datos de paquete en "setup.py" es como sigue:

package_data = {''<package name>'': [''<path to data file within package dir>'']}

Entonces en tu ejemplo:

package_data = {''package_fiddler'': [''data/*'', ''data/stylesheets/*'']}

package_data es un diccionario donde las claves son los nombres de los paquetes incluidos en el instalador. Los valores bajo estas claves deben ser listas de rutas de archivos específicas o globos / comodines dentro del directorio del paquete.

También necesita incluir la bandera:

zip_safe=False

en la setup(...) si desea poder resolver las rutas del sistema de archivos a sus datos. De lo contrario, puede usar pkg_resources para hacer esto: http://peak.telecommunity.com/DevCenter/PythonEggs#accessing-package-resources

Definitivamente no necesita un archivo __init__.py en el directorio "data" - este directorio no es un módulo y no debe ser importado.


Personalmente, no me gusta la manera en que las herramientas de configuración mezclan código y datos tanto conceptualmente como a nivel de implementación. Creo que es esa implementación la que te está haciendo tropezar aquí. Para que las herramientas de configuración encuentren y usen package_data, necesita que los datos residan dentro de un paquete python. Un paquete python puede ser un directorio, pero debe haber un archivo __init__.py en el directorio. Entonces parece que necesita los siguientes archivos (vaciar está bien):

./package_fiddler/data/__init__.py ./package_fiddler/data/stylesheets/__init__.py


utilizar

package_data={"data": [''package_fiddler/data'',]}

en lugar de

packages=[''package_fiddler'',]