Python包内置数据文件本地正常,GitHub Actions CI提示找不到如何解决?
问题原因
- 最常见原因:你的
.gitignore规则中包含了.zip后缀的文件匹配,导致clics3-network.gml.zip没有被提交到Git仓库。本地环境存在该文件所以构建正常,但是GitHub Actions拉取的代码仓库中没有这个文件,打包时无法将其包含到安装包中,最终触发文件不存在的报错。 - 文件名拼写不一致:你本地测试时提到的文件名为
clics2-network.gml.zip,但加载代码和MANIFEST.in中写的是clics3-network.gml.zip,需要确认实际文件名和配置、代码中的写法完全一致。 - MANIFEST.in兼容问题:部分旧版本setuptools对
recursive-include规则的解析存在异常,会导致匹配到的文件没有被正确打入安装包。 - 资源加载接口兼容问题:
pkg_resources是较老旧的资源加载接口,在Python 3.10+的部分环境中存在资源路径解析异常的情况。
解决办法
- 优先确认文件提交状态:检查
.gitignore是否屏蔽了.zip格式文件,确认lexedata/data/clics3-network.gml.zip已经被正常提交到Git仓库,可直接在GitHub仓库的对应路径下查看文件是否存在。 - 优化打包配置:放弃MANIFEST.in配置,直接在setup.cfg中明确指定包数据,避免规则解析异常,修改后配置如下:
[options] include_package_data = False packages = find: package_data = lexedata = data/clics3-network.gml.zip
- 替换资源加载方式:使用Python3.7+标准库自带的
importlib.resources替代老旧的pkg_resources,加载代码修改为:
# 兼容Python3.9及以上版本 from importlib.resources import open_binary import lexedata.data with open_binary(lexedata.data, "clics3-network.gml.zip") as f: # 处理文件逻辑 pass
如果需要兼容3.9以下的Python版本,在依赖中添加importlib-resources; python_version < "3.9"即可。
- 新增CI诊断步骤:可以在tox配置的commands最前端添加一行
ls {toxinidir}/lexedata/data/,执行CI时可直接从日志中看到对应路径下的文件列表,快速定位是文件缺失还是打包环节的问题。
内容的提问来源于stack exchange,提问作者Anaphory
相关产品推荐
相关产品推荐

