Pycord机器人同步命令触发KeyError: default_permission问题求助
解决Discord机器人
KeyError: 'default_permission'及自定义HelpCommand失效问题 一、错误核心原因
bot.sync_commands()执行时,Discord API要求命令对象必须包含default_permission字段,你的问题大概率是以下情况之一:
- 部分斜杠命令的权限配置未明确设置该字段
- 所用Discord.py版本与命令定义不兼容(旧版本不会自动填充该字段)
- 自定义SupremeHelpCommand的逻辑破坏了命令的元数据结构
二、分步排查与解决
1. 检查cogs中的斜杠命令定义
打开cogs/moderation.py,查看所有用@app_commands.command()装饰的命令:
- 如果手动配置权限,必须明确加上
@app_commands.default_permissions()装饰器,比如:
@app_commands.command(name="kick", description="踢出指定成员") @app_commands.default_permissions(kick_members=True) # 必须明确设置 @app_commands.checks.has_permission(kick_members=True) async def kick(self, interaction: discord.Interaction, member: discord.Member, reason: str = "无"): # 命令逻辑代码
- 别混用旧的权限设置方式,比如同时手动修改命令的
permissions属性
2. 升级Discord.py到稳定版
旧版本Discord.py处理斜杠命令同步时,不会自动为命令添加默认的default_permission字段,直接升级即可:
pip install --upgrade discord.py
3. 排查自定义SupremeHelpCommand的问题
打开classes/help.py:
- 别在HelpCommand逻辑里直接修改命令的
__dict__或元数据字段 - 如果需要读取命令权限,用官方API(比如
command.default_permission),别直接访问字典键
4. 定位问题命令(调试用)
在调用bot.sync_commands()前,加一段代码遍历所有命令,找出缺字段的那个:
for command in bot.tree.walk_commands(): if not hasattr(command, 'default_permission'): print(f"问题命令:{command.name} 缺少default_permission字段")
找到后针对性修复该命令的定义就行。
5. 修正同步命令的调用
确保用官方标准同步方式,别手动修改同步时的命令数据:
# 正确写法 await bot.tree.sync()
三、测试验证
- 先注释掉自定义HelpCommand,单独跑
bot.sync_commands(),确认同步正常 - 同步成功后,再逐步恢复HelpCommand的逻辑,排查是否是它导致的干扰
内容的提问来源于stack exchange,提问作者Karo
相关产品推荐
相关产品推荐

