¿Cómo incluir los datos del paquete con setuptools / distribuir?

Al usar setuptools / distribuir, no puedo hacer que el instalador extraiga ningún archivo package_data . Todo lo que he leído dice que la siguiente es la forma correcta de hacerlo. ¿Alguien por favor puede aconsejar?

 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.

Me doy cuenta de que esta es una pregunta antigua … pero para la gente que encuentra el camino aquí a través de Google: package_data es una mentira desagradable . Solo se usa al python setup.py bdist ... paquetes binarios ( python setup.py bdist ... ) pero no al python setup.py sdist ... 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, usar MANIFEST.in funcionará tanto para distribuciones binarias como para fonts.

Acabo de tener este mismo problema. La solución fue simplemente eliminar include_package_data=True .

Después de leer aquí , me di cuenta de que include_package_data pretende incluir archivos del control de versiones , en lugar de simplemente “incluir datos de paquetes” como su nombre indica. De los documentos:

Los archivos de datos [de include_package_data] deben estar bajo control CVS o Subversion

Si desea un control más preciso sobre qué archivos se incluyen (por ejemplo, si tiene archivos de documentación en sus directorios de paquetes y desea excluirlos de la instalación), también puede usar la palabra clave package_data .

Eliminar ese argumento lo solucionó, lo que por casualidad también funcionó cuando se cambió a distutils, ya que no toma ese argumento.

Siguiendo la recomendación de @Joe para eliminar el include_package_data=True línea include_package_data=True también funcionó para mí.

Para elaborar un poco más, no tengo ningún archivo MANIFEST.in . Yo uso Git y no CVS.

El repository toma este tipo de forma:

 /myrepo - .git/ - setup.py - myproject - __init__.py - some_mod - __init__.py - animals.py - rocks.py - config - __init__.py - settings.py - other_settings.special - cool.huh - other_settings.xml - words - __init__.py word_set.txt 

setup.py :

 from setuptools import setup, find_packages import os.path setup ( name='myproject', version = "4.19", packages = find_packages(), # package_dir={'mypkg': 'src/mypkg'}, # didnt use this. package_data = { # If any package contains *.txt or *.rst files, include them: '': ['*.txt', '*.xml', '*.special', '*.huh'], }, # # Oddly enough, include_package_data=True prevented package_data from working. # include_package_data=True, # Commented out. data_files=[ # ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']), ('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']), ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]), # ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]), ('/opt/local/myproject/data', [os.path.join('myproject/words', 'word_set.txt')]), ], install_requires=[ 'jsonschema', 'logging', ], entry_points = { 'console_scripts': [ # Blah... ], }, ) 

python setup.py sdist para una fuente de distribución (no he probado el binario).

Y cuando estoy en un entorno virtual completamente nuevo, tengo un myproject-4.19.tar.gz , y uso

 (venv) pip install ~/myproject-4.19.tar.gz ... 

Y aparte de que todo está instalado en los site-packages de site-packages mi entorno virtual, esos archivos de datos especiales se instalan en /opt/local/myproject/data y /opt/local/myproject/etc

include_package_data=True funcionó para mí.

Si usa git, recuerde incluir setuptools-git en install_requires . Mucho menos aburrido que tener un Manifest o incluir todas las rutas en package_data (en mi caso es una aplicación Django con todo tipo de estadísticas)

(pegó el comentario que hice, como k3-rnc mencionó que en realidad es útil como es)

Actualización : esta respuesta es antigua y la información ya no es válida. Todas las configuraciones de setup.py deben usar las herramientas de configuración de import setuptools . He añadido una respuesta más completa en https://stackoverflow.com/a/49501350/64313


Resolví esto cambiando a distutils. Parece que distribuir está en desuso y / o roto.

 from distutils.core import setup setup( name='myapp', packages=['myapp'], package_data={ 'myapp': ['data/*.txt'], }, ) 

Pregunta antigua y, sin embargo … la gestión de paquetes de python realmente deja mucho que desear. Así que tuve la oportunidad de instalar usando 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 repository, así que terminé aprovechando los archivos de datos y la opción setup.py –install-data; algo como esto

 pip install . --install-option="--install-data=$PWD/package" -t package 

Mover la carpeta que contiene los datos del paquete a la carpeta del módulo solucionó el problema por mí.

Vea esta pregunta: MANIFEST.in ignorado en “python setup.py install” – ¿no hay archivos de datos instalados?

Tuve el mismo problema estos dos días, pero incluso este hilo no pudo ser claro para mí. Todo es simplemente confuso. Así que hice mi investigación y encontré una solución. Básicamente, en este caso aquí es lo que debes hacer:

 from setuptools import setup setup( name='myapp', packages=['myapp'], package_dir={'myapp':'myapp'}, # the one line where all the magic happens package_data={ 'myapp': ['data/*.txt'], }, ) 

La otra respuesta completa de stackoverflow aquí