discord.py首次调用!music命令报NoneType无play属性报错如何修复
问题原因
首次执行命令时,你检测到voice为空或未连接后仅执行了加入语音频道的操作,没有将channel.connect()返回的语音客户端实例赋值给voice变量,此时voice仍为初始的None值,调用play方法自然会抛出属性错误。第二次执行命令时机器人已经加入语音频道,discord.utils.get可以正常获取到已存在的语音客户端实例,所以可以正常播放。
修复代码
仅需要修改加入频道的逻辑,将连接返回的实例赋值给voice即可,以下是优化后的完整代码:
@client.command() async def music(ctx,song : str): # 前置判断:避免用户未加入语音频道时报错 if not ctx.author.voice: await ctx.send("你需要先加入一个语音频道") return channel = ctx.author.voice.channel voice = discord.utils.get(client.voice_clients, guild=ctx.guild) if voice is None or not voice.is_connected(): # 核心修复:把连接返回的语音客户端实例赋值给voice voice = await channel.connect() song_there = os.path.isfile("Music/{}.mp3".format(song)) if song_there == True: # 新增播放状态判断,避免重复调用play方法报错 if not voice.is_playing(): voice.play(discord.FFmpegPCMAudio(('Music/{}.mp3'.format(song)))) await ctx.send('{} playing! <:white_check_mark:853651360666877972>'.format(song)) else: await ctx.send("当前已有音乐正在播放") else: await ctx.send("This file does not exists")
额外优化建议
- 如果需要支持连续播放,可以添加音乐队列逻辑,当前歌曲播放完毕后自动加载下一首
- 可以补充暂停、切歌、调整音量、显示播放列表等常用功能提升使用体验
内容的提问来源于stack exchange,提问作者qRnt
相关产品推荐
相关产品推荐

