小编典典

使用 setup.py 包含非 Python 文件

all

如何使setup.py包含不属于代码的文件?(具体来说,它是一个许可文件,但也可以是其他任何东西。)

我希望能够控制文件的位置。在原始源文件夹中,该文件位于包的根目录中。(即与最顶层相同的级别__init__.py。)无论操作系统如何,我都希望它在安装软件包时完全保留在那里。我怎么做?


阅读 88

收藏
2022-05-18

共1个答案

小编典典

可能最好的方法是使用该setuptools
package_data指令。这确实意味着使用setuptools(or
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包名(空 = 所有包)到一个模式列表(可以包括 glob)。例如,如果您只想指定包中的文件,您也可以这样做:

package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}

这里的解决方案绝对 不是 用扩展名重命名您的非py文件。.py

有关更多信息,请参阅Ian Bicking 的演示文稿

更新:另一种 [更好] 方法

如果您只想控制源代码分发 ( sdist)
的内容并在包之外拥有文件(例如顶级目录),另一种效果很好的方法是添加一个MANIFEST.in文件。有关此文件的格式,请参阅Python
文档

自从写了这个回复后,我发现使用MANIFEST.in通常是一种不那么令人沮丧的方法,它只是确保你的源代码分发 ( tar.gz) 有你需要的文件。

例如,如果你想包含requirements.txt顶层的 from ,递归地包含顶层的“数据”目录:

include requirements.txt
recursive-include data *

然而,为了在安装时将这些文件复制到站点包内的​​包文件夹中,您需要提供include_package_data=True给该setup()函数。有关详细信息,请参阅添加非代码文件

2022-05-18