Вероятно, лучший способ сделать это - использовать setuptools package_dataдирективу. Это означает использование setuptools(или distribute) вместо distutils, но это очень плавное «обновление».
Вот полный (но не проверенный) пример:
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=[],
)
Обратите внимание на конкретные строки, которые здесь важны:
package_data={'': ['license.txt']},
include_package_data=True,
package_dataявляется dictименем пакета (пусто = все пакеты) в списке шаблонов (может включать глобусы). Например, если вы хотите указать только файлы в вашем пакете, вы можете сделать это тоже:
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
Решение здесь определенно не в том, чтобы переименовывать ваши не pyфайлы с .pyрасширением.
Смотрите презентацию Яна Бикинга для получения дополнительной информации.
ОБНОВЛЕНИЕ: другой [лучший] подход
Другой подход, который работает хорошо, если вы просто хотите контролировать содержимое исходного дистрибутива ( sdist) и иметь файлы вне пакета (например, каталог верхнего уровня), - это добавить MANIFEST.inфайл. См. Документацию Python для формата этого файла.
С тех пор, как я написал этот ответ, я обнаружил, что использование, MANIFEST.inкак правило, менее разочаровывающий подход - просто убедиться, что ваш исходный дистрибутив ( tar.gz) имеет нужные вам файлы.
Например, если вы хотите включить requirements.txtиз верхнего уровня, рекурсивно включите каталог «данных» верхнего уровня:
include requirements.txt
recursive-include data *
Тем не менее, для того, чтобы эти файлы были скопированы во время установки в папку пакета внутри site-пакетов, вам необходимо предоставить include_package_data=Trueэту setup()функцию. См. Добавление файлов без кода для получения дополнительной информации.