PyInstaller打包Python应用可写入文件但无法读取文件后续修改内容
PyInstaller打包后文件读取异常解决方案
核心原因
问题本质是运行时路径不匹配:
PyInstaller的onefile模式运行时会将所有打包的资源临时解压到系统专属的_MEIPASS临时目录,你代码中使用的相对路径storage.txt默认会优先读取该临时目录下打包时内置的旧版本storage.txt;而写入操作生成的新文件会保存在exe可执行文件所在的目录,两者路径完全不一致,因此读写的不是同一个文件。该问题在--onedir模式下如果启动程序时的工作目录和exe所在目录不一致时也会出现。
修复步骤
1. 修改代码统一读写路径
不要直接使用硬编码的相对路径,通过代码自动判断运行环境,统一读写exe同级目录下的storage.txt,该适配方案对两种打包模式均适用:
import os import sys def get_base_path(): # 判断是否为打包后的运行环境 if getattr(sys, 'frozen', False): # 返回exe文件所在目录 return os.path.dirname(sys.executable) # 开发环境下返回代码文件所在目录 else: return os.path.dirname(os.path.abspath(__file__)) # 拼接得到storage.txt的绝对路径 STORAGE_FILE = os.path.join(get_base_path(), "storage.txt") def write_to_file(content): # 显式指定编码避免跨系统乱码 with open(STORAGE_FILE, 'w', encoding='utf-8') as f: f.write(content) def read_from_file(): with open(STORAGE_FILE, 'r', encoding='utf-8') as f: return f.read()
2. 调整打包操作
- 如果你需要初始的
storage.txt,打包时不需要添加--add-data参数,打包完成后直接把初始storage.txt复制到exe同级目录即可 - 如果你希望初始文件内置到包内自动释放,可在程序启动时加判断:如果exe同级目录不存在
storage.txt,就从_MEIPASS目录下将内置的初始文件复制到同级目录,后续统一读写同级目录的文件即可
内容的提问来源于stack exchange,提问作者xikodev
相关产品推荐
相关产品推荐

