使用Pyinstaller将.py打包为exe时找不到生成的输出文件如何解决
问题根源
带--onefile参数打包的PyInstaller程序,启动时会先把所有依赖资源解压到系统临时目录下随机命名的_MEIxxxx文件夹,再从这个临时目录加载运行,程序退出后临时目录会被自动删除。
原代码失效的核心原因:
- 直接取
os.path.dirname(sys.executable)在部分运行场景下拿到的是临时解压目录的路径,写入的data.txt存在临时目录里,程序退出后随临时目录一起被删除,自然找不到。 - 如果把exe放在C盘根目录、Program Files这类系统权限保护路径,普通用户身份运行时没有目录写入权限,Windows会自动把写入操作重定向到用户目录下的VirtualStore虚拟路径,你在exe所在目录看不到生成的文件。
修复方法
根据你需要的文件存储位置选对应写法:
持久化存储:文件保存在exe所在目录(匹配你的需求)
先判断运行环境,做路径绝对化处理,避开临时目录,修复后代码如下:
import os import sys def get_app_path(): if getattr(sys, 'frozen', False): # 打包环境下,取exe真实存放的外部目录 return os.path.dirname(os.path.abspath(sys.executable)) else: # 源码运行环境下,取当前脚本所在目录 return os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(get_app_path(), 'data.txt') # 用with上下文管理器操作文件,自动处理关闭,避免异常导致资源泄漏 with open(file_path, 'w', encoding='utf-8') as f: f.write("something")
配套注意事项
- 如果必须把exe放在系统受保护目录运行,PyInstaller打包时加
--uac-admin参数,让程序启动时申请管理员权限,避免系统自动重定向写入路径。 - 不要用
os.getcwd()获取程序目录,这个方法返回的是程序启动时的工作目录,从其他路径调用exe、或者快捷方式起始位置配置错误时,拿到的路径完全不符合预期。
临时存储:文件仅在程序运行期间存在
如果不需要持久保存文件,只是运行时临时用,可以直接用PyInstaller提供的临时解压目录路径,路径存在sys._MEIPASS属性中:
import os import sys def get_temp_path(): if getattr(sys, 'frozen', False): # 打包环境下取临时解压目录 return sys._MEIPASS else: # 源码环境下取脚本所在目录 return os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(get_temp_path(), 'data.txt') with open(file_path, 'w', encoding='utf-8') as f: f.write("something")
注意:这个临时目录下的所有文件会在程序退出后被自动清理,仅适合存放运行时临时生成的缓存类文件。
额外排查项
如果改完代码仍找不到文件,排查两个常见问题:
- 杀毒软件、系统安全防护是否拦截了程序的写入操作,把生成的
data.txt自动隔离删除。 - 右键查看exe所在目录的权限属性,确认当前登录用户对该目录有写入权限。
内容的提问来源于stack exchange,提问作者user242318
相关产品推荐
相关产品推荐

