discord.py开发Discord机器人时Cog内ping命令报错缺少ctx参数如何解决?
问题排查与解决方案
错误根源
从报错信息和代码可以定位到2个核心错误:
- Cog类内的命令装饰器使用错误:Cog类内部定义命令不能用
@bot.command,必须使用@commands.command()装饰器。类内的异步方法第一个参数默认是类实例本身self,你之前的写法把第一个参数命名为ctx,实际接收到的是autoreply类的实例,discord.py找不到预期的ctx参数,才会抛出参数缺失的错误。 - Cog文件内重复实例化Bot:你在auto-reply.py里再次执行
bot = commands.Bot(command_prefix=">")创建了新的Bot实例,这个实例没有实际运行,还会和main.py里的主Bot实例产生冲突,属于完全多余的代码。
修复步骤
直接替换auto-reply.py的全部代码为以下内容即可:
import discord from discord.ext import commands class autoreply(commands.Cog): def __init__(self, bot): self.bot = bot @commands.command(name="ping") async def yo(self, ctx: commands.Context): await ctx.send("pong") def setup(bot): bot.add_cog(autoreply(bot))
修复说明
- 删掉了Cog文件内多余的Bot实例化代码
- 把命令装饰器换成了Cog专用的
@commands.command() - 在命令方法的参数里第一个位置加了
self,第二个位置才是ctx,符合Python类方法的参数规则
修改完成后重新启动main.py,调用>ping命令就可以正常返回pong。
内容的提问来源于stack exchange,提问作者Koll
相关产品推荐
相关产品推荐

