使用setup.cfg为Python包包含数据文件夹时,安装后仅部分文件存在的问题排查
解决setuptools打包时数据文件夹文件未完全分发的问题
根据你的描述,我推测问题大概率出在文件匹配规则的局限性上,另外也有几个其他可能的点需要排查,下面一步步来分析和解决:
1. 最可能的原因:匹配模式*.*无法覆盖所有文件
你在MANIFEST.in和setup.cfg里都用了*.*作为匹配规则,这个模式只能匹配带有扩展名的文件,但spacy的模型文件夹ru_core_news_sm-3.1.0里肯定存在不少没有扩展名的文件(比如vocab/strings、tokenizer/prefix_rules这类),还有子目录里的文件也无法被*.*递归匹配到。
修改方案:
- 更新
MANIFEST.in,把规则改成递归匹配所有文件:recursive-include test_project_name/ru_core_news_sm-3.1.0 **/* - 同步修改
setup.cfg里的[options.package_data]配置:[options.package_data] test_project_name/ru_core_news_sm-3.1.0 = **/*
**/*这个模式会递归遍历目标文件夹下的所有子目录,匹配所有类型的文件(不管有没有扩展名)。
2. 检查是否有忽略规则干扰
如果你的项目里有.gitignore文件,setuptools在打包时可能会参考git的忽略列表(尤其是当你使用了setuptools-scm工具,或者setuptools的默认行为),导致某些文件被排除在外。
排查方法:
- 临时注释掉
.gitignore里的所有规则,重新打包测试,看是否缺失的文件被包含了。 - 如果确实是.gitignore的问题,可以在
MANIFEST.in里用include指令强制包含被忽略的文件,比如:include test_project_name/ru_core_news_sm-3.1.0/vocab/strings
3. 先验证打包内容,再安装
直接用pip install安装源码可能看不到中间过程,建议先打包成wheel包,检查包里的内容是否完整:
- 先更新打包工具:
pip install --upgrade setuptools wheel build - 生成包文件:
python -m build - 解压生成的wheel包(在
dist目录下),查看test_project_name/ru_core_news_sm-3.1.0下的文件是否完整。如果这里已经缺失,那就是打包规则的问题;如果这里完整但安装后缺失,再排查pip安装的问题。
4. 清理旧安装缓存
有时候本地安装会有缓存残留,导致新修改的配置没有生效,可以先卸载旧包,清理缓存后重新安装:
pip uninstall -y test-project-name pip cache purge pip install path/to/base_project_name
按照上面的步骤修改后,应该就能完整分发所有数据文件了。
内容的提问来源于stack exchange,提问作者Pux
相关产品推荐
相关产品推荐

