如何让含MP3的Python闹钟脚本运行时不崩溃?
问题解决指南
一、先搞定直接运行崩溃的核心问题
你碰到的ModuleNotFoundError: No module named 'pygame',本质是环境不一致:
- PyCharm用的是项目专属虚拟环境,这个环境里已经装了pygame;
- 直接双击
.py文件时,系统调用的是全局Python环境,这个环境没装pygame。
解决步骤:
- 打开命令提示符(CMD),根据你的Python版本输入安装命令:
- 用Python3的话输入
pip3 install pygame - 系统只有Python2的话输入
pip install pygame
如果电脑装了多个Python版本,要对应PyCharm里的版本,比如PyCharm用Python3.9,就输pip3.9 install pygame
- 用Python3的话输入
- 验证:CMD里输
python -c "import pygame; print('安装成功')",没报错就说明搞定了。
二、无需打包的优化方案(含base64嵌入音频)
1. 用相对路径调用MP3(替代绝对路径)
把MP3和脚本放同一目录,用代码自动拼接路径,避免不同电脑路径不兼容:
import os # 获取脚本所在文件夹的绝对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接MP3文件的完整路径 mp3_path = os.path.join(script_dir, "你的铃声文件名.mp3")
2. 用base64把MP3嵌入脚本(不用单独带音频文件)
操作分两步:
- 先把MP3转成base64字符串:
新建个临时脚本,运行下面的代码,会生成audio_base64.txt,里面就是编码后的内容:import base64 with open("你的铃声文件名.mp3", "rb") as f: audio_data = base64.b64encode(f.read()).decode("utf-8") with open("audio_base64.txt", "w") as f: f.write(audio_data) - 在闹钟脚本里嵌入编码内容,运行时解码播放:
import pygame import base64 import os import tempfile # 把audio_base64.txt里的内容粘贴到这里 AUDIO_BASE64 = "粘贴编码内容" # 解码到临时文件 with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as temp_file: temp_file.write(base64.b64decode(AUDIO_BASE64)) temp_path = temp_file.name # 初始化pygame播放 pygame.mixer.init() pygame.mixer.music.load(temp_path) pygame.mixer.music.play() # 播放完删除临时文件(可选) while pygame.mixer.music.get_busy(): pygame.time.Clock().tick(10) os.unlink(temp_path)
注意:base64编码会让文件体积增大约30%,大体积MP3不建议用这个方法
三、打包分发方案(转成单个可执行文件)
用pyinstaller工具打包,步骤:
- 安装pyinstaller:
pip install pyinstaller - 命令行进入脚本所在文件夹,执行打包命令:
pyinstaller --onefile --add-data "你的铃声文件名.mp3;." alarm_clock.py--onefile:打包成单个exe文件--add-data:把MP3打包进去,Windows用;分隔路径,Mac/Linux用:
- 打包完成后,exe文件在
dist文件夹里,双击就能运行,不用装Python和pygame。
内容的提问来源于stack exchange,提问作者Marko
相关产品推荐
相关产品推荐

