配置MANIFEST.in与setup.py后,data_folder未被纳入site-packages的问题排查
你已经做了不少正确的基础配置,但data_folder还是没被打包到安装包中,大概率是因为setuptools对数据文件的处理需要更明确的声明,或者存在缓存、路径匹配的问题。下面是一步步的排查和修复方法:
1. 优化MANIFEST.in的匹配规则
你的MANIFEST.in语句include src/pkg/folder2/data_folder/*路径是对的,但可以改成递归匹配来避免遗漏子文件(如果后续有新增的话):
recursive-include src/pkg/folder2/data_folder *
这条语句会包含data_folder下的所有文件及子目录内容。
2. 在setup.py中显式配置package_data
include_package_data=True虽然会读取MANIFEST.in,但有时候setuptools需要更明确的包级数据绑定。在setup.py中添加package_data参数:
from setuptools import setup, find_packages setup( # 你的其他核心配置(name, version, author等) package_dir={"": "src"}, packages=find_packages("src"), include_package_data=True, # 新增包数据声明 package_data={ # 键是子包的完整名称(从src下的根包开始) "pkg.folder2": ["data_folder/*"] } )
这里的"pkg.folder2"是你的子包名称,"data_folder/*"是相对于该包目录的文件路径,明确告诉setuptools要把这个目录下的文件作为pkg.folder2包的一部分。
3. 清理构建缓存,重新打包安装
旧的构建缓存经常会导致新配置不生效,先删除缓存文件:
rm -rf build/ dist/ *.egg-info
然后重新构建并安装包:
python setup.py sdist bdist_wheel pip install dist/*.whl
4. 确保依赖setuptools而非distutils
如果你的setup.py导入的是distutils,它对include_package_data和package_data的支持非常有限。一定要开头导入setuptools:
# 正确的导入方式 from setuptools import setup, find_packages # 避免使用:from distutils.core import setup
为什么之前的配置没生效?
include_package_data=True的作用是让setuptools读取MANIFEST.in的规则,但它依赖工具正确识别包结构,且容易受旧缓存干扰。显式配置package_data相当于给setuptools一个明确的指令,直接把数据文件绑定到对应包上,避免了路径匹配的模糊性。
内容的提问来源于stack exchange,提问作者Lawhatre

