Discord py无法读取JSON中指定服务器自定义前缀输出问题求助
问题排查与解决方法
核心问题定位
你代码的核心矛盾是键的类型不匹配:
- 你在
changeprefix方法里存储前缀时,把服务器ID转成了字符串类型str(ctx.guild.id)作为JSON的键 - 但在help方法里读取时,直接用了int类型的
ctx.guild.id去取JSON里的键,JSON不存在int类型的键,自然会抛出KeyError导致逻辑失效
排查步骤
- 运行help命令时查看控制台报错,如果是
KeyError报错,基本可以确定是上述类型不匹配问题 - 手动打开
prefixes.json文件检查,确认所有键都是字符串格式的服务器ID - 检查是否存在未修改过前缀的新服务器,这类服务器的ID不存在于JSON文件中,直接取值也会报错
修复代码
首先修改help方法里取值的逻辑,把服务器ID转成字符串,同时添加默认前缀兜底逻辑,避免新服务器、私聊场景报错:
@client.command(aliases=["commands"]) async def help(ctx, cmd=None): # 防止在私聊频道触发时报错,先判断是否为服务器频道 if not ctx.guild: await ctx.send("该命令仅可在服务器中使用") return with open('prefixes.json', 'r') as f: prefixes = json.load(f) # 1. 转成字符串类型的服务器ID取键 2. 没查到就返回默认前缀,示例默认前缀为'!'可自行修改 p = prefixes.get(str(ctx.guild.id), '!') embed=discord.Embed(color=0xff0080, description= f"<:polylogo:894531390899642419> **Prefix** ``{p}``\nJoin our Official Discord\n\n**Moderation (7)** \n``{p}Warn, {p}Warnings, {p}Mute, {p}Unmute, {p}Kick, {p}Ban, {p}Unban``\n\n**Utility / Miscellaneous (5)** \n ``{p}Ping, {p}Avatar, {p}Info, {p}Sinfo, {p}Help, {p}Members``") await ctx.send(embed=embed)
优化建议
不用每次执行命令都读一次JSON文件,可以把前缀配置加载到内存缓存里,修改的时候同时更新缓存和JSON文件,能减少IO操作提升效率。
内容的提问来源于stack exchange,提问作者cdnAshton
相关产品推荐
相关产品推荐

