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

