python - 使用 setup.py 包含非 Python 文件

如何使 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/

相关文章:

linux - 每个虚拟主机的error_log?

python - 如何搜索和替换文件中的文本?

python - "this"模块的源代码是做什么的?

c - Linux 中多线程的信号处理

python - 如何将 python 日期时间转换为具有可读格式日期的字符串?

linux - 查找 -exec cmd {} + vs | xargs

python - 如何访问 Django 模板中的字典元素?

linux - 如何清空 ("truncate")Linux上已经存在并以某种方式受到保护的文件?

linux - 如何让 CRON 调用正确的路径

android - 找不到构建工具修订版 23.0.1