如何使 setup.py
包含不属于代码的文件? (具体来说,它是一个许可文件,但也可以是其他任何东西。)
我希望能够控制文件的位置。在原始源文件夹中,该文件位于包的根目录中。 (即与最顶层的 __init__.py
处于同一级别。)无论操作系统如何,我都希望它在安装包时完全保留在那里。我该怎么做?
最佳答案
可能最好的方法是使用 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 *
不过,为了在安装时将这些文件复制到站点包内的包文件夹中,您需要向 setup()include_package_data=True
/函数。见 Adding Non-Code Files了解更多信息。
https://stackoverflow.com/questions/1612733/