Prawdopodobnie najlepszym sposobem na to jest skorzystanie z setuptools package_datadyrektywy. Oznacza to użycie setuptools(lub distribute) zamiast distutils, ale jest to bardzo płynna „aktualizacja”.
Oto pełny (ale nieprzetestowany) przykład:
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=[],
)
Zwróć uwagę na konkretne wiersze, które są tutaj krytyczne:
package_data={'': ['license.txt']},
include_package_data=True,
package_datajest dictnazwą pakietu (pusta = wszystkie pakiety) do listy wzorców (może zawierać globusy). Na przykład, jeśli chcesz określić tylko pliki w pakiecie, możesz to zrobić również:
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
Rozwiązaniem tutaj jest zdecydowanie nie zmiana nazwy pyplików innych niż pliki z .pyrozszerzeniem.
Zobacz prezentację Iana Bickinga, aby uzyskać więcej informacji.
AKTUALIZACJA: Kolejne podejście [lepsze]
Innym podejściem, które działa dobrze, jeśli chcesz kontrolować zawartość źródłowej dystrybucji ( sdist) i mieć pliki poza pakietem (np. Katalog najwyższego poziomu), jest dodanie MANIFEST.inpliku. Zobacz dokumentacji Pythona do formatu tego pliku.
Od czasu napisania tej odpowiedzi stwierdziłem, że używanie MANIFEST.injest zazwyczaj mniej frustrujące, aby upewnić się, że dystrybucja źródłowa ( tar.gz) zawiera potrzebne pliki.
Na przykład, jeśli chcesz dołączyć requirements.txtz najwyższego poziomu, rekurencyjnie dołącz katalog „danych” najwyższego poziomu:
include requirements.txt
recursive-include data *
Niemniej jednak, aby te pliki mogły zostać skopiowane podczas instalacji do folderu pakietu w pakietach witryn, musisz dostarczyć include_package_data=Truetę setup()funkcję. Aby uzyskać więcej informacji, zobacz Dodawanie plików innych niż kodowe .