如何解决Python使用gTTS时出现的「[Errno 13] Permission denied」报错
问题根因
该报错的核心原因是output.mp3文件的句柄未被正常释放,由两个问题共同触发:
- 代码中冗余的
open("output.mp3","w")操作打开文件后没有执行关闭,残留了占用句柄 playsound库存在Windows平台的已知缺陷:音频播放结束后不会主动释放对应文件的句柄,导致后续运行时要覆盖写入该文件时,被系统判定为文件被占用,抛出权限错误。
排查与解决方法
- 第一步先删除代码中多余的
open("output.mp3","w")语句,gTTS的save()方法本身会自动创建并写入文件,不需要提前手动打开,该冗余操作本身就会造成文件占用。 - 回退
playsound到无句柄泄漏的版本:当前最新版playsound的Windows句柄泄漏问题尚未修复,回退到1.2.2版本即可解决,执行安装命令:pip install playsound==1.2.2 - 更换音频播放库:也可以换用
pygame等其他不存在文件占用问题的音频库实现播放,规避原生playsound的缺陷。 - 生成唯一临时文件名:如果不想修改依赖库,可以每次运行时生成带唯一标识的文件名,避免重复写入同一个被占用的文件,示例代码如下:
from gtts import gTTS import os from playsound import playsound import time language = "en" output = gTTS(text="hello world", lang=language, slow=False) # 用时间戳生成唯一文件名,避免重复占用 file_name = f"output_{int(time.time())}.mp3" output.save(file_name) playsound(file_name) # 播放完成后可删除临时文件,避免占用存储空间 os.remove(file_name)
- 临时解决方案:Windows系统下如果遇到报错,可以通过资源监视器找到占用
output.mp3的进程,手动结束进程即可恢复写入,但该方法治标不治本,建议优先从代码层面修复。
内容的提问来源于stack exchange,提问作者Nick Heumann
相关产品推荐
相关产品推荐

