可能最好的方法是使用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 是包名称(空 = 所有包)到模式列表(可以包括 glob)的dict。例如,如果您只想指定包中的文件,您也可以这样做:
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
这里的解决方案绝对不用.py 扩展名重命名您的非py 文件。
请参阅Ian Bicking's presentation 了解更多信息。
更新:另一种 [更好] 方法
如果您只想控制源代码分发的内容 (sdist) 并在包之外拥有文件(例如顶级目录),另一种效果很好的方法是添加一个 MANIFEST.in 文件。该文件的格式见the Python documentation。
自从写下这个回复后,我发现使用MANIFEST.in 通常是一种不那么令人沮丧的方法,它可以确保您的源代码分发 (tar.gz) 具有您需要的文件。
例如,如果您想从顶层包含requirements.txt,则递归地包含顶层“数据”目录:
include requirements.txt
recursive-include data *
不过,为了在安装时将这些文件复制到 site-packages 内的包文件夹中,您需要将 include_package_data=True 提供给 setup() 函数。请参阅Adding Non-Code Files 了解更多信息。