Cuando uso setuptools / distribution, no puedo hacer que el instalador extraiga ningún package_data
archivo. 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_files
solucionó 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_data
ydata_files
?pyproject.toml
. No sesetup.py
requiere 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_data
es 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.in
funcionará tanto para binarios como para distribuciones de origen.fuente
package_data
funciona parabdist
y nosdist
. Sin embargo ,MANIFEST.in
funciona parasdist
, pero no parabdist
! Por lo tanto, lo mejor que he podido encontrar es incluir ambospackage_data
yMANIFEST.in
acomodar ambosbdist
ysdist
.MANIFEST.in
para archivos que no instalará, como documentación, ypackage_data
para archivos que use que no sean código Python (como una imagen o plantilla).MANIFEST.in
ypackage_data
. Parece queMANIFEST.in
controla 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.in
son relativas a la ubicación de setup.py, ypackage_data
es relativa a la raíz de los paquetes individuales (por ejemplo, módulos).package_data
incluirse 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_data
objetivo 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=True
entrada. 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_data
problema resuelve está más allá en el texto original : si usa elinclude_package_data
argumento específico de setuptools , los archivos especificados porpackage_data
no se agregarán automáticamente al manifiesto a menos que estén listados en elMANIFEST.in
archivo.package_data
establecido una lista no vacía y especificarinclude_package_data=False
? ¿Y por qué necesitarías especificar archivos dos vecesMANIFEST.in
ypackage_data
?Seguir las recomendaciones de @Joe para eliminar la
include_package_data=True
línea también funcionó para mí.Para elaborar un poco más, no tengo ningún
MANIFEST.in
archivo. Yo uso Git y no CVS.El repositorio toma este tipo de forma:
setup.py
:Corro
python setup.py sdist
por una fuente de distribución (no he probado binario).Y cuando estoy dentro de un nuevo entorno virtual, tengo un
myproject-4.19.tar.gz
archivo 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/data
y/opt/local/myproject/etc
.fuente
include_package_data=True
trabajó para mi.Si usa git, recuerde incluirlo
setuptools-git
eninstall_requires
. Mucho menos aburrido que tener unaManifest
ruta 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=True
no se estaba cumpliendo . Entonces, con esa configuración, solo necesita MANIFEST.in, no es necesario duplicar su lista de archivos en lapackage_data
configuració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
sdist
ybdist_wheel
, ¿has comprobado por qué?sdist
ignorapackage_data
cuando 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.py
muy pequeño y mover la configuración a unsetup.cfg
archivo. Con este enfoque, puede poner los datos de su paquete en una[options.package_data]
sección:En este caso,
setup.py
puede 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.cfg
a favor depyproject.toml
lo 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.cfg
es realmente una forma diferente de escribir lo que el OP ya estaba haciendo ensetup.py
la pregunta (pasando elpackage_data
argumento 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.