Python playsound调用子目录mp3报错:驱动无法识别指定命令参数
问题现象
运行以下Python代码尝试播放Assets子目录下的mp3文件:
from playsound import playsound import threading threading.Thread(target=playsound, args=('Assets\Loss.mp3',)).start()
执行后抛出如下异常:
Error 259 for command: play "Assets\Loss.mp3" wait The driver cannot recognize the specified command parameter. Error 305 for command: close "Assets\Loss.mp3" Cannot specify extra characters after a string enclosed in quotation marks. Failed to close the file: "Assets\Loss.mp3" Traceback (most recent call last): File "C:\Users\ekila\Downloads\Smart Auto Bet\Test.py", line 10, in <module> playsound('Assets\Loss.mp3') File "C:\Python310\lib\site-packages\playsound.py", line 73, in _playsoundWin winCommand(u'play {}{}'.format(sound, ' wait' if block else '')) File "C:\Python310\lib\site-packages\playsound.py", line 64, in winCommand raise PlaysoundException(exceptionMessage) playsound.PlaysoundException: Error 259 for command: play "Assets\Loss.mp3" wait The driver cannot recognize the specified command parameter.
测试确认特殊现象:将目标mp3移动到Python脚本同级目录,传入文件名Loss.mp3调用时,音频可正常播放无报错,但需求是需要将mp3文件存放在Assets子目录下。
当前环境与已尝试方案:
- 安装的playsound版本为1.2.2
- 不使用多线程、直接调用playsound,问题仍复现
问题原因
这个报错是playsound 1.2.2版本Windows端的固有bug:底层调用Windows MCI多媒体接口发送播放指令时,对带目录层级的相对路径解析逻辑有缺陷,反斜杠路径会干扰MCI指令的引号闭合规则,导致驱动识别不到正确的命令参数;当音频文件放在脚本同级目录时,传入的路径不带目录分隔符,不会触发这个解析bug,因此可以正常播放。
解决方案
以下方案任选其一即可:
- 方案1(最稳妥,推荐):传入音频文件的绝对路径,不需要修改第三方库代码。借助os模块动态拼接路径,兼容不同运行目录,代码示例:
from playsound import playsound import threading import os # 获取当前脚本所在目录的绝对路径 base_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接Assets目录下音频文件的完整路径 audio_path = os.path.join(base_dir, "Assets", "Loss.mp3") threading.Thread(target=playsound, args=(audio_path,)).start()
- 方案2(改动最小):直接将相对路径中的Windows反斜杠替换为正斜杠,MCI接口原生支持正斜杠作为路径分隔符,不会触发解析错误,修改后代码如下:
from playsound import playsound import threading # 路径改为Assets/Loss.mp3 threading.Thread(target=playsound, args=('Assets/Loss.mp3',)).start()
- 方案3:如果以上方案不生效,可以修改本地playsound库源码:打开Python安装目录下
Lib/site-packages/playsound.py文件,找到winCommand函数,修正MCI指令拼接逻辑,给所有传入的音频路径统一包裹双引号,不要仅在路径包含空格时才添加引号即可。
内容的提问来源于stack exchange,提问作者UnknownEncoder
相关产品推荐
相关产品推荐

