You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyInstaller打包后遇FileNotFoundError:资源文件路径问题求助

PyInstaller打包后资源文件找不到的解决办法及项目结构建议

为什么会出现FileNotFoundError?

开发时你用的相对路径resources/request_Doc.json是基于项目根目录的,但PyInstaller打包后有两个核心问题导致路径失效:

  1. 程序运行时的当前工作目录不一定是打包后的程序所在目录(比如用户可能在其他目录下启动程序)
  2. 打包后的Python脚本会被放到临时目录(如_internal文件夹),原来的相对路径完全不适用

不管你怎么移动文件或者用--add-data,只要代码里还是用基于工作目录的相对路径,就会找不到文件。

解决步骤

1. 修改代码中的路径获取逻辑

在func_a.py里,通过脚本自身的绝对路径来拼接资源路径,确保不管程序在哪运行都能定位到资源:

import os
import json

# 获取当前func_a.py文件所在的绝对目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 根据项目结构拼接资源路径:假设func_a在functions目录,resources在项目根目录
resource_file = os.path.join(current_dir, "../resources/request_Doc.json")
# 标准化路径(处理跨平台的路径分隔符差异)
resource_file = os.path.normpath(resource_file)

# 读取JSON文件
with open(resource_file, "r", encoding="utf-8") as f:
    data = json.load(f)

2. 确保打包时正确添加资源

根据操作系统选择对应的--add-data语法:

  • Windows:用分号分隔源路径和目标路径
    pyinstaller main.py --add-data "resources/*.json;resources"
    
  • Linux/macOS:用冒号分隔
    pyinstaller main.py --add-data "resources/*.json:resources"
    

如果使用spec文件,需确保datas字段配置正确:

# main.spec文件中
a = Analysis(
    ['main.py'],
    datas=[('resources/*.json', 'resources')],
    # 其他配置项...
)

然后执行pyinstaller main.spec完成打包。

推荐的项目结构设计

清晰的结构能避免路径混乱,也便于维护和打包,推荐结构如下:

your_project/
├── main.py              # 程序入口文件
├── functions/           # 存放所有功能模块
│   ├── __init__.py      # 标记为Python包
│   ├── func_a.py
│   └── func_b.py
├── resources/           # 统一存放静态资源(JSON、图片、配置文件等)
│   ├── request_Doc.json
│   └── requirement.json
├── tests/               # 测试用例目录(可选)
│   └── test_func_a.py
├── venv/                # 虚拟环境(打包时无需包含,可添加到.gitignore)
└── README.md            # 项目说明文档

结构优势

  • 功能模块与资源分离,逻辑清晰
  • 资源集中管理,打包时只需配置resources目录即可
  • 测试代码独立,不影响主程序逻辑

内容的提问来源于stack exchange,提问作者Paul Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:55:07