cx_Freeze打包含playsound的Python脚本生成exe运行时cmd窗口闪退问题
cx_Freeze打包exe运行闪退问题解决方案
问题表现
使用cx_Freeze打包Python音频播放脚本后,生成的exe文件运行时仅弹出1秒cmd窗口就自动关闭,无法正常播放sound.mp3音频。
原项目代码
Setup.py 打包配置
import sys from cx_Freeze import setup, Executable packages = ["playsound", "os", "time", "multiprocessing"] Sound = Executable( script = "sound.py", targetName = "sound.py", ) setup(name = "sound" , version = "0.1" , options = {"build_exe": {"packages": packages}}, description = "" , executables = [Sound] )
Sound.py 业务代码
import multiprocessing from playsound import playsound import os file_location = os.path.dirname(__file__) + '\sound.mp3.mp3' playsound(file_location)
问题原因
导致闪退的核心问题有以下几点:
- 打包配置未指定base参数,Windows平台下cx_Freeze默认生成控制台程序,代码执行完成无阻塞逻辑就会直接退出
- targetName配置错误,生成的目标文件后缀为.py而非.exe,不符合Windows可执行文件规范
- 音频文件路径配置错误,代码中写了重复的
.mp3后缀,且未将音频文件纳入打包资源列表,exe运行时找不到对应资源直接崩溃 - 路径拼接直接使用反斜杠,存在路径识别异常风险
解决方案
方案1:修复cx_Freeze打包配置
修改Setup.py代码如下:
import sys from cx_Freeze import setup, Executable # 配置要包含的资源文件,把sound.mp3加入打包列表 include_files = ["sound.mp3"] packages = ["playsound", "os", "time", "multiprocessing"] # Windows下设置base为Win32GUI隐藏控制台,targetName改为exe后缀 base = "Win32GUI" if sys.platform == "win32" else None Sound = Executable( script = "sound.py", target_name = "sound.exe", base=base ) setup(name = "sound" , version = "0.1" , options = {"build_exe": {"packages": packages, "include_files": include_files}}, description = "" , executables = [Sound] )
同时修改Sound.py的路径拼接逻辑:
import multiprocessing from playsound import playsound import os file_location = os.path.join(os.path.dirname(__file__), 'sound.mp3') playsound(file_location)
方案2:更换打包工具(提问者验证有效)
直接使用PyInstaller工具打包,执行以下命令即可:pyinstaller -w sound.py --add-data "sound.mp3;."
其中-w参数会隐藏控制台窗口,--add-data会把音频文件打包到生成的exe目录下,无需额外修改原业务代码即可正常运行。
内容的提问来源于stack exchange,提问作者Infacter
相关产品推荐
相关产品推荐

