Вероятно, лучший способ сделать это - использовать директиву 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
из верхнего уровня, рекурсивно включите каталог «data» верхнего уровня:
include requirements.txt
recursive-include data *
Тем не менее, для того, чтобы эти файлы были скопированы во время установки в папку пакета внутри site-пакетов, вам необходимо указать include_package_data=True
для функции setup()
. См. Добавление файлов без кода для получения дополнительной информации.