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'',]