使用PyInstaller打包Pygame游戏后如何避免高分记录文件重置为初始状态
问题根因
PyInstaller的--onefile单文件打包模式的运行逻辑是:每次启动exe时,会将所有预先打包的资源(包括你通过--add-data参数打入的assets文件夹)解压到系统临时目录的随机专属文件夹内。你在程序运行过程中写入assets文件夹的高分记录,实际是存在这个临时文件夹里的,程序关闭后临时文件夹会被系统自动清理。下次再启动exe时会重新解压原始的、未修改过的assets文件夹,所以之前存储的高分记录就会被重置。
解决方案
下面给出3种可行的修复方案,可根据你的需求选择:
- 方案1(最推荐):将高分记录存储到用户专属的永久目录
不要把可写的用户数据存在打包的assets目录里,改为读写系统自带的用户目录(比如Windows的AppData、macOS的Application Support、Linux的~/.config),这类目录默认有写入权限,不会被系统自动清理。参考实现代码:
后续所有高分读写操作都使用上面的import os # 适配多系统的用户配置目录获取 if os.name == "nt": # Windows系统,取AppData漫游目录 save_root = os.environ.get("APPDATA") else: # 类Unix系统,取用户家目录下的.config文件夹 save_root = os.path.join(os.path.expanduser("~"), ".config") # 创建你的游戏专属的存储目录 game_save_dir = os.path.join(save_root, "你的游戏名称") os.makedirs(game_save_dir, exist_ok=True) # 高分文件的最终路径 high_score_path = os.path.join(game_save_dir, "high_score.txt")high_score_path路径即可,不会再出现重置问题。 - 方案2:放弃单文件打包,改用目录打包模式
去掉打包命令中的--onefile参数,直接打包为目录形式,命令如下:
打包完成后会在dist目录生成和main同名的文件夹,里面包含exe程序和完整的assets目录,这个assets目录是真实存在于本地磁盘的,写入的内容会永久留存,不会被重置。pyinstaller main.py --windowed --add-data "assets;assets" - 方案3:将高分文件存在exe同级目录下
先通过代码获取exe本身的所在路径,后续读写操作都指向exe同级目录下的高分文件或者assets目录,不要操作PyInstaller生成的临时目录下的资源。获取exe所在路径的参考代码:import sys import os if getattr(sys, "frozen", False): # 打包后运行时的路径 base_path = os.path.dirname(sys.executable) else: # 开发阶段运行时的路径 base_path = os.path.dirname(os.path.abspath(__file__)) # 你可以选择直接在同级目录存高分文件,或者创建assets目录存储 high_score_path = os.path.join(base_path, "high_score.txt") # 如果要存在同级assets目录,先创建目录即可 # os.makedirs(os.path.join(base_path, "assets"), exist_ok=True) # high_score_path = os.path.join(base_path, "assets", "high_score.txt")
内容的提问来源于stack exchange,提问作者SuPythony
相关产品推荐
相关产品推荐

