Мабуть, найкращий спосіб зробити це - використовувати 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 *
Проте, для того , щоб ці файли , які будуть скопійовані під час установки в папку пакета всередині сайту-пакетів, вам необхідно надати include_package_data=Trueв setup()функції. Див. Розділ Додавання файлів без коду для отримання додаткової інформації.