如何使setup.py包含不属于代码的文件?(具体来说,它是一个许可文件,但也可以是其他任何东西。)
setup.py
我希望能够控制文件的位置。在原始源文件夹中,该文件位于包的根目录中。(即与最顶层相同的级别__init__.py。)无论操作系统如何,我都希望它在安装软件包时完全保留在那里。我怎么做?
__init__.py
可能最好的方法是使用该setuptools package_data指令。这确实意味着使用setuptools(or distribute) 而不是distutils,但这是一个非常无缝的“升级”。
setuptools
package_data
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)。例如,如果您只想指定包中的文件,您也可以这样做:
dict
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
这里的解决方案绝对 不是 用扩展名重命名您的非py文件。.py
py
.py
有关更多信息,请参阅Ian Bicking 的演示文稿。
如果您只想控制源代码分发 ( sdist) 的内容并在包之外拥有文件(例如顶级目录),另一种效果很好的方法是添加一个MANIFEST.in文件。有关此文件的格式,请参阅Python 文档。
sdist
MANIFEST.in
自从写了这个回复后,我发现使用MANIFEST.in通常是一种不那么令人沮丧的方法,它只是确保你的源代码分发 ( tar.gz) 有你需要的文件。
tar.gz
例如,如果你想包含requirements.txt顶层的 from ,递归地包含顶层的“数据”目录:
requirements.txt
include requirements.txt recursive-include data *
然而,为了在安装时将这些文件复制到站点包内的包文件夹中,您需要提供include_package_data=True给该setup()函数。有关详细信息,请参阅添加非代码文件。
include_package_data=True
setup()