Probabilmente il modo migliore per farlo è usare la setuptools package_datadirettiva. Questo significa usare setuptools(o distribute) invece di distutils, ma questo è un "upgrade" molto semplice.
Ecco un esempio completo (ma non testato):
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=[],
)
Nota le linee specifiche che sono fondamentali qui:
package_data={'': ['license.txt']},
include_package_data=True,
package_dataè un nome dictdi pacchetto (vuoto = tutti i pacchetti) in un elenco di modelli (può includere globs). Ad esempio, se si desidera specificare solo i file all'interno del pacchetto, è possibile farlo anche:
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
La soluzione qui è sicuramente non per rinominare i non- pyfile con .pyestensione.
Vedi la presentazione di Ian Bicking per maggiori informazioni.
AGGIORNAMENTO: un altro approccio [migliore]
Un altro approccio che funziona bene se si desidera solo controllare il contenuto della distribuzione di origine ( sdist) e disporre di file all'esterno del pacchetto (ad esempio directory di livello superiore) è quello di aggiungere un MANIFEST.infile. Consulta la documentazione di Python per il formato di questo file.
Da quando ho scritto questa risposta, ho scoperto che l'utilizzo MANIFEST.inè in genere un approccio meno frustrante per assicurarsi che la distribuzione di origine ( tar.gz) abbia i file necessari.
Ad esempio, se si desidera includere il requirements.txtlivello principale, includere ricorsivamente la directory "dati" di livello superiore:
include requirements.txt
recursive-include data *
Tuttavia, per poter copiare questi file al momento dell'installazione nella cartella del pacchetto all'interno dei pacchetti del sito, sarà necessario fornire include_package_data=Truealla setup()funzione. Vedere Aggiunta di file non di codice per ulteriori informazioni.