如何使用PyInstaller将pygame游戏的音效文件打包进exe可执行文件
PyInstaller打包Pygame音效进单EXE解决方案
核心问题
你的配置存在两个不匹配的问题,导致无法找到音效文件:
- 单EXE模式下PyInstaller运行时会把所有打包的资源解压到系统临时目录,对应路径存放在
sys._MEIPASS属性中,你之前取的sys.executable目录是EXE存放的位置,不是资源实际解压的位置 .spec配置里你把音效文件打包到了根目录下的Sounds文件夹,但代码里读取的是Assets/Sounds路径,两者不匹配
具体修改步骤
步骤1:修正运行路径获取逻辑
修改main.py中的路径判断代码,打包后优先读取临时资源目录:
if getattr(sys, "frozen", False): # 打包运行时取临时解压目录路径 EXE_LOCATION = sys._MEIPASS else: # 开发阶段取脚本所在目录 EXE_LOCATION = os.path.dirname(os.path.realpath(__file__)) pygame.init() sound_effects = SoundEffects(EXE_LOCATION)
步骤2:统一资源路径(二选一即可)
方案A:修改.spec配置适配现有代码
把.spec文件中的added_files修改为如下内容,让打包后的资源路径和代码读取路径匹配:
added_files = [('C:\\Users\\joshu\\CursorHunters\\Assets\\Sounds\\*.wav', 'Assets\\Sounds')]
该方案不需要修改sound_effects.py的代码。
方案B:修改音效加载代码适配现有.spec配置
把sound_effects.py中所有音效加载路径的Assets/Sounds替换为Sounds,比如:
# 原来的写法 self.explosion1 = pygame.mixer.Sound(os.path.join(EXE_LOCATION, "Assets", "Sounds", "explosion1.wav")) # 修改后的写法 self.explosion1 = pygame.mixer.Sound(os.path.join(EXE_LOCATION, "Sounds", "explosion1.wav"))
该方案不需要修改.spec文件。
步骤3:重新打包
打包时必须指定修改后的.spec文件作为参数,不要直接打包main.py:
pyinstaller "Cursor Hunters.spec"
修改完成后生成的EXE就已经包含了所有音效文件,运行时不需要额外携带Assets文件夹。
内容的提问来源于stack exchange,提问作者TheAngriestCrusader
相关产品推荐
相关产品推荐

