已注册Discord应用命令无法触发:CommandNotFound错误求助
解决方法
首先明确:Discord的应用命令(斜杠命令)和discord.py的前缀命令是完全独立的两套系统,不能混用。你已经在服务器注册了应用命令,就得用应用命令的装饰器编写处理逻辑,而非前缀命令的@bot.command()。
正确实现步骤
- 替换装饰器
把前缀命令的装饰器换成应用命令的@bot.tree.command(name="huncho"),这样才能关联到你已注册的应用命令。示例代码:
@bot.tree.command(name="huncho") async def huncho(interaction: discord.Interaction): await interaction.response.send_message("这是huncho应用命令的响应")
- 同步命令(可选但关键)
如果是手动注册的命令,建议在bot启动时添加同步逻辑,保证代码和Discord端的命令定义一致:
@bot.event async def on_ready(): # 同步指定服务器的命令,替换成你的服务器ID await bot.tree.sync(guild=discord.Object(id=你的服务器ID)) print(f"{bot.user} 已上线并同步命令")
注:如果是全局命令,去掉guild参数即可,但全局命令同步可能需要1小时左右生效。
为什么未注册时能正常运行?
未注册应用命令时,你触发的是前缀命令(比如!huncho),这时@bot.command()的逻辑生效;但注册应用命令后,你触发的是斜杠命令(/huncho),Discord会寻找对应的应用命令处理逻辑,而你代码里没写,所以报错。
额外注意
- 应用命令的处理函数必须接收
interaction参数,前缀命令接收的是ctx(上下文),两者不能混用。 - 如果需要同时支持前缀命令和斜杠命令,可以分别写两个处理函数:
# 前缀命令 @bot.command() async def huncho(ctx): await ctx.send("这是前缀命令的响应") # 应用命令 @bot.tree.command(name="huncho") async def huncho_slash(interaction: discord.Interaction): await interaction.response.send_message("这是斜杠命令的响应")
内容的提问来源于stack exchange,提问作者Lane Henslee
相关产品推荐
相关产品推荐

