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

PyInstaller打包后如何让exe每次运行读取目录下最新文件?

问题解答

你的判断完全正确

当用PyInstaller的--add-data参数打包文件时,这些文件会被嵌入到生成的exe中,程序运行时会自动将它们解压到sys._MEIPASS指向的临时目录。你的代码在打包模式下直接读取这个临时目录里的文件,而该目录内的内容是打包时的原始文件副本,和exe所在目录中你修改后的文件毫无关联,所以每次运行只会读取打包时的旧版本。

实现读取exe目录最新文件的方案

要让程序每次运行优先读取exe所在目录的最新文件,只需修改resolve_path函数的逻辑:优先检查exe目录下是否存在目标文件,存在则读取;不存在再回退到打包时嵌入的默认文件(避免用户误删文件导致程序崩溃)。

修改后的代码如下:

import sys
import os

def resolve_path(path):
    if getattr(sys, "frozen", False):
        # 获取exe所在的目录路径
        exe_dir = os.path.dirname(os.path.abspath(sys.executable))
        # 拼接exe目录下的目标文件路径
        target_path = os.path.abspath(os.path.join(exe_dir, path))
        # 优先读取exe目录的文件,不存在则用打包时的默认文件
        if os.path.exists(target_path):
            resolved_path = target_path
            print(resolved_path,'-+-')
        else:
            resolved_path = os.path.abspath(os.path.join(sys._MEIPASS, path))
            print(resolved_path,'-+-')
    else:
        # 开发模式逻辑保持不变
        resolved_path = os.path.abspath(os.path.join(os.getcwd(), path))
        print(resolved_path, '+-+')

    return resolved_path

# 后续业务代码无需改动
with pd.ExcelWriter(resolve_path('outputFile/outputData.xlsm'), engine='openpyxl', mode='a', if_sheet_exists='overlay') as writer:
    book = load_workbook(resolve_path('outputFile/outputData.xlsm'), keep_vba=True)

额外注意事项

  • 打包时仍需保留--add-data参数,这样当exe目录缺少目标文件时,程序能读取打包时嵌入的默认文件作为兜底
  • 确保exe所在目录的outputFile文件夹结构和打包时一致,否则会触发兜底逻辑读取旧文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:05:19