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
相关产品推荐
相关产品推荐

