You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:57:02