python - setuptools find_packages
¿Cómo incluir los datos del paquete con setuptools/distribute? (7)
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
apunta a incluir archivos desde el control de versiones , en lugar de simplemente "incluir datos del paquete" como su nombre lo 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 detallado sobre qué archivos están incluidos (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
.
Sacar esa discusión lo arregló, que es coincidentemente por qué también funcionó cuando cambiaste a distutils, ya que no toma ese argumento.
Al usar setuptools / distribute, 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. ¿Puede alguien por favor asesorar?
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 vieja pregunta ... pero para las personas que encuentran la manera de llegar aquí a través de Google: package_data
es una mentira sucia y 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 la creación de una distribución de origen daría como resultado 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 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?
Pregunta antigua y, sin embargo ... la administración de paquetes de pitón realmente deja mucho que desear. Así que tuve el caso práctico de instalar utilizando pip localmente en un directorio específico y me sorprendió que las rutas package_data y data_files no funcionasen. 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
pip install . --install-option="--install-data=$PWD/package" -t package
Seguir la recomendación de @Joe para eliminar la línea include_package_data=True
también me ha funcionado.
Para elaborar un poco más, no tengo ningún archivo MANIFEST.in
. Yo uso Git y no CVS.
El repositorio 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 distrib (no he probado el binario).
Y cuando estoy dentro de un nuevo entorno virtual, tengo un myproject-4.19.tar.gz
, y uso
(venv) pip install ~/myproject-4.19.tar.gz
...
Y aparte de que todo se instala 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 todo el camino en package_data
(en mi caso es una aplicación django con todo tipo de estática)
(pegado el comentario que hice, como k3-rnc mencionó es realmente ú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 import setuptools
. He agregado una respuesta más completa en https://.com/a/49501350/64313
Lo resolví cambiando a distutils. Parece que la distribución está obsoleta y / o rota.
from distutils.core import setup
setup(
name=''myapp'',
packages=[''myapp''],
package_data={
''myapp'': [''data/*.txt''],
},
)