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

Pyinstaller打包exe文件路径错误导致FileNotFoundError求助

解决Pyinstaller打包exe后文件路径错误问题

问题原因

Pyinstaller打包exe后,程序运行时会把代码解压到系统临时目录(比如C:\Users\MyUsername\AppData\Local\Temp\...),此时os.path.dirname(__file__)获取的是临时目录路径,而非原脚本所在的桌面目录,导致拼接后的文件路径错误,触发FileNotFoundError。

解决方案

提供两种常用修复方式,根据需求选择:

方式1:将sources目录打包进exe

适合需要单文件exe的场景,把依赖的sources目录一起打包到exe中:

修改代码

替换原路径获取逻辑,兼容打包/未打包两种运行状态:

import os
import sys
import csv

# 获取基准路径:打包后用Pyinstaller临时解压目录,未打包用脚本所在目录
base_dir = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
# 按原目录结构拼接文件路径,用os.path.normpath规范路径格式
full_path = os.path.normpath(os.path.join(base_dir, '../sources/sources.csv'))

with open(full_path, 'r') as csv_file:
    csv_table = list(csv.reader(csv_file, delimiter=';'))

打包命令

执行Pyinstaller时,通过--add-data参数将sources目录包含进exe:

  • Windows系统:
pyinstaller --add-data "sources;sources" your_script.py
  • Linux/macOS系统:
pyinstaller --add-data "sources:sources" your_script.py

方式2:让exe读取外部的sources目录

适合不需要单文件,允许exe和sources目录共存的场景:

修改代码

直接获取exe所在的目录作为基准路径,确保sources目录和exe放在同一位置:

import os
import sys
import csv

# 获取程序运行的根目录:打包时是exe所在目录,未打包时是脚本所在目录
if getattr(sys, 'frozen', False):
    base_dir = os.path.dirname(sys.executable)
else:
    base_dir = os.path.dirname(os.path.abspath(__file__))

# 拼接文件路径(此时sources目录需与exe同目录)
full_path = os.path.join(base_dir, 'sources/sources.csv')

with open(full_path, 'r') as csv_file:
    csv_table = list(csv.reader(csv_file, delimiter=';'))

这种方式不需要特殊打包参数,只要把exe和sources目录放在同一文件夹(比如C:\Users\MyUsername\Desktop\Pythonprogram)即可正常读取文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:21:31