Discord.py(Rewrite)命令日志打印问题:Cog中出现NameError
嘿,我来帮你搞定这个报错!你遇到的discord.ext.commands.errors.CommandInvokeError本质是因为Cog模块里找不到ConsoleCMD这个名称——大概率是你在主文件里定义了这个用于打印命令调用信息的功能,但没在Cog里正确引用它,或者没做跨文件的导入处理。
问题根源
你应该是在主文件里写了ConsoleCMD函数/类来记录命令调用时间和名称,但在Cog的命令函数里直接调用了它,而Cog所在的文件并没有导入这个对象,所以Python抛出了NameError。
解决方案
我给你几个实用的解决思路,按推荐程度排序:
方案1:用全局命令监听事件(最推荐,最优雅)
discord.py自带on_command事件,可以全局捕获所有命令的调用,不用在每个命令里手动调用ConsoleCMD,彻底避免跨文件引用问题。
在你的主文件里添加这段代码:
from datetime import datetime from discord.ext import commands bot = commands.Bot(command_prefix="你的前缀") # 全局监听命令调用,自动打印日志 @bot.event async def on_command(ctx): call_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") print(f"[{call_time}] 命令 '{ctx.command.name}' 被用户 {ctx.author.name} 调用") # 加载你的Cog bot.load_extension("cogs.你的Cog文件名") bot.run("你的机器人TOKEN")
这样不管是主文件里的命令还是Cog里的命令,只要被触发,终端都会自动打印调用时间和命令名称,完全不需要在Cog里写额外代码。
方案2:将ConsoleCMD封装为工具函数(适合需要自定义调用的场景)
如果一定要保留ConsoleCMD的手动调用,把它放到单独的工具文件里,避免跨文件导入的混乱:
- 创建一个
utils.py文件,写入:
from datetime import datetime def ConsoleCMD(cmd_name): call_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") print(f"[{call_time}] 命令 {cmd_name} 被调用")
- 在主文件和Cog文件里都导入这个函数:
from utils import ConsoleCMD
之后在Cog的命令里就能正常调用ConsoleCMD(ctx.command.name)了。
方案3:直接从主文件导入ConsoleCMD
如果你的ConsoleCMD是定义在主文件(比如main.py)里的,在Cog文件顶部添加导入:
from main import ConsoleCMD
注意:如果Cog在子文件夹(比如cogs/)里,需要用相对导入:
from ..main import ConsoleCMD
不过这种方式可能会因为Python的模块导入规则出现问题,所以优先推荐前两个方案。
额外提醒
CommandInvokeError只是外层的错误包装,真正的问题是内部的NameError,只要解决了ConsoleCMD未定义的问题,这个外层错误自然就会消失。
内容的提问来源于stack exchange,提问作者Kai

