Probablemente la mejor manera de hacerlo es usar la setuptools
package_data
directiva. Esto significa usar setuptools
(o distribute
) en lugar de distutils
, pero esta es una "actualización" muy fluida.
Aquí hay un ejemplo completo (pero no probado):
from setuptools import setup, find_packages
setup(
name='your_project_name',
version='0.1',
description='A description.',
packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
package_data={'': ['license.txt']},
include_package_data=True,
install_requires=[],
)
Tenga en cuenta las líneas específicas que son críticas aquí:
package_data={'': ['license.txt']},
include_package_data=True,
package_data
es un nombre dict
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:
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
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 un MANIFEST.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:
include requirements.txt
recursive-include data *
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 la setup()
función. Consulte Agregar archivos sin código para obtener más información.