本地可运行的Pytest在Github Actions中报FileNotFoundError求助
检查路径大小写一致性
本地Windows/macOS环境是大小写不敏感的,但Github Actions使用的Linux环境严格区分大小写。确认代码中引用gazetteer的路径大小写,和实际文件的大小写完全匹配,避免出现代码写Gazetteer但实际文件是gazetteer的情况。打印资源查找的绝对路径
在测试代码中加入调试逻辑,输出程序尝试加载资源的具体路径,对比实际安装路径:import os import pkg_resources try: resource_path = pkg_resources.resource_filename('ml_save_memory_flow.ner_re.resources', 'gazetteer') print(f"资源查找路径: {resource_path}") print(f"文件是否存在: {os.path.exists(resource_path)}") except Exception as e: print(f"获取路径出错: {e}")在Github Actions日志中查看输出,确认路径是否和site-packages中的实际位置一致。
验证资源文件的安装状态
在Github Actions的构建步骤中添加命令,直接查看site-packages下目标目录的内容:# 先确认包的安装位置 PKG_LOC=$(pip show ml_save_memory_flow | grep Location | awk '{print $2}') # 列出资源目录下的文件 ls -la $PKG_LOC/ml_save_memory_flow/ner_re/resources/ # 检查文件权限 ls -l $PKG_LOC/ml_save_memory_flow/ner_re/resources/gazetteer确认
gazetteer文件存在且具备可读权限(Linux下至少有r权限)。检查package_data配置的有效性
本地可能用pip install -e .的可编辑模式,直接读取源码目录的资源;但Github Actions中是正常安装,需确保setup.py配置正确:setup( # 其他配置项... package_data={ 'ml_save_memory_flow.ner_re.resources': ['gazetteer'], }, include_package_data=True, # 若使用MANIFEST.in则需开启 )同时确认MANIFEST.in(如果存在)是否包含该资源:
include ml_save_memory_flow/ner_re/resources/gazetteer修正资源加载方式
如果代码中用相对路径(比如../resources/gazetteer)加载资源,本地可能正常,但安装到site-packages后相对路径会失效。改用Python标准的资源加载方式:from importlib.resources import files resource_path = files('ml_save_memory_flow.ner_re.resources').joinpath('gazetteer')检查工作目录差异
测试代码若依赖当前工作目录,而Github Actions的工作目录和本地不同,会导致路径错误。在测试前添加命令打印当前工作目录:pwd同时排查测试代码中是否有依赖当前目录的逻辑。
查看安装过程的警告/错误
在Github Actions的pip install步骤日志中,检查是否有关于package_data的警告(比如资源文件找不到、无法复制等),这些信息可能直接指向配置问题。
内容的提问来源于stack exchange,提问作者badner

