Windows10下使用pydub的AudioSegment出现PermissionError求助
问题描述
我用Python写了一段播放WAV音频的代码,运行时触发权限错误。每次报错的临时文件名都不一样,文件路径指向系统临时目录,但实际去路径里找根本没有这个文件。
代码
from pydub import AudioSegment from pydub.playback import play try: song=AudioSegment.from_wav("myfile.wav") except IOError: print("can not open file") try: play(song) except IOError: print("can not play file")
带try块的运行输出
My Project Python/my project python/play wav.py" can not play file
移除try块后的报错信息
Traceback (most recent call last): File "d:\My Project Python\my project python\play wav.py", line 7, in <module> play(song) File "C:\Users\H&M\AppData\Local\Programs\Python\Python310\lib\site-packages\pydub\playback.py", line 71, in play _play_with_ffplay(audio_segment) File "C:\Users\H&M\AppData\Local\Programs\Python\Python310\lib\site-packages\pydub\playback.py", line 15, in _play_with_ffplay seg.export(f.name, "wav") File "C:\Users\H&M\AppData\Local\Programs\Python\Python310\lib\site-packages\pydub\audio_segment.py", line 867, in export out_f, _ = _fd_or_path_or_tempfile(out_f, 'wb+') File "C:\Users\H&M\AppData\Local\Programs\Python\Python310\lib\site-packages\pydub\utils.py", line 60, in _fd_or_path_or_tempfile fd = open(fd, mode=mode) PermissionError: [Errno 13] Permission denied: 'C:\\Users\\H&M\\AppData\\Local\\Temp\\tmp7t2o2ta1.wav'
解决办法
这个错误本质是Python进程没有权限在系统临时目录创建或写入临时文件,每次文件名不同是因为pydub会随机生成临时文件名,而文件不存在是因为创建失败导致的。试试以下几种方案:
检查临时目录权限
右键打开C:\Users\H&M\AppData\Local\Temp,选择「属性」→「安全」,确认当前登录用户拥有「写入」「修改」权限。如果没有,点击「编辑」按钮添加对应权限。排除安全软件拦截
不少杀毒软件或系统安全工具会限制程序在临时目录的写入操作,可暂时关闭安全软件测试,或者把Python程序以及临时目录添加到安全软件的信任列表。手动指定临时文件路径
绕过系统临时目录,自己指定一个有权限的路径(比如脚本所在目录)来生成临时文件,修改代码如下:from pydub import AudioSegment import os import tempfile try: song = AudioSegment.from_wav("myfile.wav") except IOError: print("无法打开文件") try: # 在当前脚本目录创建临时文件,播放完成后手动删除 with tempfile.NamedTemporaryFile(mode='wb+', suffix='.wav', delete=False, dir=os.getcwd()) as temp_file: song.export(temp_file.name, format="wav") # 调用ffplay播放,需确保ffmpeg已安装且在环境变量中 os.system(f'ffplay -autoexit "{temp_file.name}"') os.unlink(temp_file.name) except Exception as e: print(f"播放失败: {str(e)}")注意:此方法需要提前安装ffmpeg,并将其添加到系统环境变量中。
规避用户名特殊字符
你的用户名包含&符号,可能导致路径解析异常。可以把Python项目移动到不含特殊字符的路径(比如D:\PythonProjects\AudioPlayer),或者用不含特殊字符的用户账户测试。
内容的提问来源于stack exchange,提问作者Muhammad Alijani
相关产品推荐
相关产品推荐

