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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:18:01