¿Cómo hago para setup.py
incluir un archivo que no es parte del código? (Específicamente, es un archivo de licencia, pero podría ser cualquier otra cosa).
Quiero poder controlar la ubicación del archivo. En la carpeta de origen original, el archivo está en la raíz del paquete. (es decir, en el mismo nivel que el superior __init__.py
). Quiero que permanezca exactamente allí cuando se instale el paquete, independientemente del sistema operativo. ¿Cómo puedo hacer eso?
data_files = [('', ['lgpl2.1_license.txt',]),]
lo pone en la carpeta Python26.Respuestas:
Probablemente la mejor manera de hacerlo es usar la
setuptools
package_data
directiva. Esto significa usarsetuptools
(odistribute
) en lugar dedistutils
, pero esta es una "actualización" muy fluida.Aquí hay un ejemplo completo (pero no probado):
Tenga en cuenta las líneas específicas que son críticas aquí:
package_data
es un nombredict
de paquete (vacío = todos los paquetes) a una lista de patrones (puede incluir globos). Por ejemplo, si solo desea especificar archivos dentro de su paquete, también puede hacerlo:La solución aquí es definitivamente no cambiar el nombre de los
py
archivos que no sean con una.py
extensión.Vea la presentación de Ian Bicking para más información.
ACTUALIZACIÓN: Otro enfoque [mejor]
Otro enfoque que funciona bien si solo desea controlar el contenido de la distribución fuente (
sdist
) y tener archivos fuera del paquete (por ejemplo, directorio de nivel superior) es agregar unMANIFEST.in
archivo. Consulte la documentación de Python para ver el formato de este archivo.Desde que escribí esta respuesta, descubrí que el uso
MANIFEST.in
suele ser un enfoque menos frustrante para asegurarse de que su distribución de origen (tar.gz
) tenga los archivos que necesita.Por ejemplo, si desea incluir
requirements.txt
desde el nivel superior, incluya recursivamente el directorio de "datos" de nivel superior:Sin embargo, para que estos archivos se copien en el momento de la instalación en la carpeta del paquete dentro de los paquetes del sitio, deberá suministrar
include_package_data=True
a lasetup()
función. Consulte Agregar archivos sin código para obtener más información.fuente
Para lograr lo que estás describiendo tomarás dos pasos ...
Paso 1: para agregar el archivo al archivo tar de origen, inclúyalo en el MANIFEST
Cree una plantilla MANIFEST en la carpeta que contiene setup.py
El MANIFEST es básicamente un archivo de texto con una lista de todos los archivos que se incluirán en el archivo tar de origen.
Así es como se ve el MANIFEST para mi proyecto:
Nota: Si bien sdist hace agregar algunos archivos de forma automática , prefiero que especificar explícitamente para estar seguro en lugar de predecir lo que hace y no lo hace.
Paso 2: para instalar el archivo de datos en la carpeta de origen, modifique setup.py
Como está buscando agregar un archivo de datos (LICENSE.txt) a la carpeta de instalación de origen, debe modificar la ruta de instalación de datos para que coincida con la ruta de instalación de origen. Esto es necesario porque, de manera predeterminada, los archivos de datos se instalan en una ubicación diferente a los archivos de origen.
Para modificar el directorio de instalación de datos para que coincida con el directorio de instalación de origen ...
Extraiga la información del directorio de instalación de distutils con:
Modifique el directorio de instalación de datos para que coincida con el directorio de instalación de origen:
Y agregue el archivo de datos y la ubicación a la configuración ():
Nota: Los pasos anteriores deben cumplir exactamente lo que describió de manera estándar sin requerir ninguna biblioteca de extensiones.
fuente
package_data
, no funciona si el archivo no está en el paquete.crear
MANIFEST.in
en la raíz del proyecto conrecursive-include
el directorio requerido oinclude
con el nombre del archivo.la documentación se puede encontrar aquí
fuente
Quería publicar un comentario en una de las preguntas, pero no tengo suficiente reputación para hacerlo>.>
Esto es lo que funcionó para mí (surgió después de referir los documentos):
La última línea fue, por extraño que parezca, también crucial para mí (también puede omitir este argumento de palabra clave, funciona igual).
Lo que esto hace es que copia todos los archivos de texto en su directorio de nivel superior o raíz (un nivel más arriba del paquete
mypkg
que desea distribuir).¡Espero que esto ayude!
fuente
MANIFEST.in
, esto funcionó para mí. La última línea también fue crucial para mí. Mis líneas fueroninclude_package_data=False, package_data={ "": ["../CHANGELOG.md"] },
Es 2019, y esto es lo que está funcionando: a pesar de los consejos aquí y allá, lo que encontré en Internet medio documentado está utilizando
setuptools_scm
, pasado como opciones asetuptools.setup
. Esto incluirá cualquier archivo de datos que esté versionado en su VCS, ya sea git o cualquier otro, al paquete de la rueda, y hará una "instalación de pip" desde el repositorio de git para llevar esos archivos.Entonces, acabo de agregar estas dos líneas a la llamada de configuración en "setup.py". Sin instalaciones adicionales o requisitos de importación:
No es necesario enumerar manualmente package_data, o en un archivo MANIFEST.in; si está versionado, está incluido en el paquete. Los documentos de "setuptools_scm" ponen énfasis en la creación de un número de versión desde la posición de confirmación, y no tienen en cuenta la parte realmente importante de agregar los archivos de datos. (No me importa si mi archivo de rueda intermedia se llama "* 0.2.2.dev45 + g3495a1f" o usará el número de versión codificado "0.3.0dev0" que he escrito, pero dejo archivos cruciales para el programa trabajar detrás es algo importante)
fuente
Paso 1: crea un
MANIFEST.in
archivo en la misma carpeta con setup.pyPaso 2: incluya la ruta relativa a los archivos que desea agregar
MANIFEST.in
Paso 3: configure
include_package_data=True
lasetup()
función para copiar estos archivos en el paquete del sitioLa referencia está aquí.
fuente
En setup.py bajo setup (:
fuente
package_data
no tendrá influencia sobre lo quesetup.py install
hace, a menos que modifique el comando de instalación en sí. A menos que esos archivos estén en el directorio del paquete, que generalmente es algo que desea evitar.Aquí hay una respuesta más simple que funcionó para mí.
Primero, según el comentario anterior de Python Dev, no se requieren setuptools:
Eso es genial porque poner un requisito de herramientas de configuración en su paquete significa que también tendrá que instalarlo. En breve:
fuente
pkgame
no existeSolo quería hacer un seguimiento de algo que encontré trabajando con Python 2.7 en Centos 6. Agregar el paquete de datos o archivos de datos como se mencionó anteriormente no funcionó para mí. Agregué un MANIFEST.IN con los archivos que quería que pusieron los archivos que no son de Python en el tarball, pero no los instalé en la máquina de destino a través de RPM.
Al final, pude obtener los archivos en mi solución usando las "opciones" en la configuración / herramientas de configuración. Los archivos de opciones le permiten modificar varias secciones del archivo de especificaciones desde setup.py. Como sigue.
archivo - MANIFEST.in:
file - filewithinstallcommands:
fuente
Encontrado una solución: Me cambió el nombre a mi
lgpl2.1_license.txt
algpl2.1_license.txt.py
, y poner algunas citas triples en todo el texto. Ahora no necesito usar ladata_files
opción ni especificar ninguna ruta absoluta. Convertirlo en un módulo de Python es feo, lo sé, pero lo considero menos feo que especificar rutas absolutas.fuente