Cuando uso setuptools / distribution, no puedo hacer que el instalador extraiga ningún package_dataarchivo. Todo lo que he leído dice que la siguiente es la forma correcta de hacerlo. ¿Alguien puede aconsejarme?
setup(
name='myapp',
packages=find_packages(),
package_data={
'myapp': ['data/*.txt'],
},
include_package_data=True,
zip_safe=False,
install_requires=['distribute'],
)
donde myapp/data/es la ubicación de los archivos de datos.
python
setuptools
distribute
cmcginty
fuente
fuente

data_filessolucionó el problema. Pero esto es propenso a errores y no me parece "correcto". ¿Alguien puede verificar que es realmente necesario duplicar la configuración en ambospackage_dataydata_files?pyproject.toml. No sesetup.pyrequiere archivo.Respuestas:
Me doy cuenta de que esta es una vieja pregunta, pero para las personas que encuentran su camino aquí a través de Google:
package_dataes una mentira sucia . Solo se usa al construir paquetes binarios (python setup.py bdist ...) pero no cuando se compilan paquetes fuente (python setup.py sdist ...). Esto es, por supuesto, ridículo: uno esperaría que construir una distribución de origen resultaría en una colección de archivos que podrían enviarse a otra persona para construir la distribución binaria.En cualquier caso, el uso
MANIFEST.infuncionará tanto para binarios como para distribuciones de origen.fuente
package_datafunciona parabdisty nosdist. Sin embargo ,MANIFEST.infunciona parasdist, pero no parabdist! Por lo tanto, lo mejor que he podido encontrar es incluir ambospackage_datayMANIFEST.inacomodar ambosbdistysdist.MANIFEST.inpara archivos que no instalará, como documentación, ypackage_datapara archivos que use que no sean código Python (como una imagen o plantilla).MANIFEST.inypackage_data. Parece queMANIFEST.incontrola lo que se incluye en la distribución, y package_data controla lo que posteriormente se copia en el directorio site_packages durante la instalación. Confusamente, las rutas de accesoMANIFEST.inson relativas a la ubicación de setup.py, ypackage_dataes relativa a la raíz de los paquetes individuales (por ejemplo, módulos).package_dataincluirse automáticamente en el ZIP si no tiene un archivo MANIFEST.in existente , y solo si está utilizando 2.7+.Acabo de tener este mismo problema. La solución, era simplemente eliminar
include_package_data=True.Después de leer aquí , me di cuenta de que el
include_package_dataobjetivo es incluir archivos del control de versiones , en lugar de simplemente "incluir datos del paquete" como su nombre lo indica. De los documentos:Eliminar ese argumento lo solucionó, lo cual es coincidencia por qué también funcionó cuando cambiaste a distutils, ya que no toma ese argumento.
fuente
include_package_data=Trueentrada. La única solución para mí es agregar una entrada en Manifiesto como se sugirió anteriormente. ¿Te importa que estaba usando setuptools, tal vez tu versión funciona con 'distribuir'?include_package_dataproblema resuelve está más allá en el texto original : si usa elinclude_package_dataargumento específico de setuptools , los archivos especificados porpackage_datano se agregarán automáticamente al manifiesto a menos que estén listados en elMANIFEST.inarchivo.package_dataestablecido una lista no vacía y especificarinclude_package_data=False? ¿Y por qué necesitarías especificar archivos dos vecesMANIFEST.inypackage_data?Seguir las recomendaciones de @Joe para eliminar la
include_package_data=Truelínea también funcionó para mí.Para elaborar un poco más, no tengo ningún
MANIFEST.inarchivo. Yo uso Git y no CVS.El repositorio toma este tipo de forma:
setup.py:Corro
python setup.py sdistpor una fuente de distribución (no he probado binario).Y cuando estoy dentro de un nuevo entorno virtual, tengo un
myproject-4.19.tar.gzarchivo y usoY aparte de todo lo que se instala en mi entorno virtual
site-packages, esos archivos de datos especiales se instalan en/opt/local/myproject/datay/opt/local/myproject/etc.fuente
include_package_data=Truetrabajó para mi.Si usa git, recuerde incluirlo
setuptools-giteninstall_requires. Mucho menos aburrido que tener unaManifestruta o incluirlapackage_data(en mi caso, es una aplicación django con todo tipo de estadísticas)(pegué el comentario que hice, ya que k3-rnc mencionó que en realidad es útil como es)
fuente
Actualización : esta respuesta es antigua y la información ya no es válida. Todas las configuraciones de setup.py deben usar
import setuptools. Agregué una respuesta más completa en https://stackoverflow.com/a/49501350/64313Resolví esto cambiando a distutils. Parece que distribuir está obsoleto y / o roto.
fuente
include_package_data=Trueno se estaba cumpliendo . Entonces, con esa configuración, solo necesita MANIFEST.in, no es necesario duplicar su lista de archivos en lapackage_dataconfiguración.Antigua pregunta y sin embargo ... la gestión de paquetes de python realmente deja mucho que desear. Así que tuve el caso de uso de instalar pip localmente en un directorio específico y me sorprendió que las rutas package_data y data_files no funcionaran. No estaba interesado en agregar otro archivo al repositorio, así que terminé aprovechando data_files y la opción setup.py --install-data; algo como esto
fuente
Mover la carpeta que contiene los datos del paquete a la carpeta del módulo resolvió el problema para mí.
Vea esta pregunta: MANIFEST.in ignorado en "python setup.py install" - ¿no hay archivos de datos instalados?
fuente
Tuve el mismo problema durante un par de días, pero incluso este hilo no pudo ayudarme, ya que todo era confuso. Así que hice mi investigación y encontré la siguiente solución:
La otra respuesta completa de stackoverflow aquí
fuente
Simplemente elimine la línea:
desde su script de configuración, y funcionará bien. (Probado ahora con las últimas herramientas de configuración).
fuente
sdistybdist_wheel, ¿has comprobado por qué?sdistignorapackage_datacuando esto se establece.Usando setup.cfg (setuptools ≥ 30.3.0)
A partir de setuptools 30.3.0 (publicado el 12/12/2016), puede mantener su
setup.pymuy pequeño y mover la configuración a unsetup.cfgarchivo. Con este enfoque, puede poner los datos de su paquete en una[options.package_data]sección:En este caso,
setup.pypuede ser tan corto como:Para obtener más información, consulte la configuración de la instalación utilizando los archivos setup.cfg .
Se habla de menospreciar
setup.cfga favor depyproject.tomllo propuesto en PEP 518 , pero esto todavía es provisional a partir de 2020-02-21.fuente
pip install.pip install, para una versión suficientemente moderna de pip, primero construirá una rueda y luego la instalará. Sin embargo, para muchos usuarios, este enfoque no incluirá silenciosamente los datos del paquete. Consulte la respuesta aceptada y los comentarios debajo para obtener detalles al respecto. Usando unsetup.cfges realmente una forma diferente de escribir lo que el OP ya estaba haciendo ensetup.pyla pregunta (pasando elpackage_dataargumento de la palabra clave en la llamada asetup), por lo que no creo que esto sea particularmente útil como respuesta a esta pregunta . No se trata el problema subyacente en absoluto.