Python转EXE时遇FileNotFoundError:无法找到struct.json文件
问题原因与解决方案
问题本质
PyInstaller的单文件模式和文件夹模式运行机制完全不同:
- 文件夹模式下,所有依赖文件(包括
struct.json、ext.json)会直接放在输出文件夹里,和exe同目录,所以./struct.json这类相对路径能正常找到文件。 - 单文件模式下,PyInstaller会把所有代码和依赖打包成单个exe,运行时会先将整个包解压到系统临时目录(比如Windows的
%temp%\_MEIxxxxxx)。此时代码里的./struct.json指向的是你运行exe的当前目录,而非临时目录里的json文件,自然会触发找不到文件的错误。
解决步骤
1. 修改代码,动态获取资源路径
通过PyInstaller提供的sys._MEIPASS变量获取临时目录路径,结合文件名拼接出正确的资源路径。修改你的文件读取代码:
import sys import os def get_resource_path(filename): # 打包后环境:使用临时目录路径 if hasattr(sys, '_MEIPASS'): return os.path.join(sys._MEIPASS, filename) # 开发环境:使用脚本所在目录的绝对路径 return os.path.join(os.path.dirname(os.path.abspath(__file__)), filename) # 读取json文件(建议用with语句自动管理文件句柄) with open(get_resource_path('struct.json'), encoding="utf-8") as struct_file: # 这里添加你的文件处理逻辑 pass with open(get_resource_path('ext.json'), encoding="utf-8") as ext_file: # 这里添加你的文件处理逻辑 pass
用
os.path.dirname(os.path.abspath(__file__))替代./,能确保开发环境下,无论你在哪个目录运行py文件,都能从脚本所在目录正确读取资源。
2. 确认PyInstaller命令参数正确
你当前的--add-data参数无需修改,它能正确将json文件打包进exe,运行时解压到临时目录根目录:
--add-data "../../ext.json;." --add-data "../../struct.json;."
验证
重新运行py-to-exe.bat生成单文件exe,运行后即可正常读取json文件。
内容的提问来源于stack exchange,提问作者O'Schell
相关产品推荐
相关产品推荐

