Discord.py中迁移到Cog的定时任务无报错不运行,该如何解决?
问题排查及修复方案
1. 核心语法错误导致任务中断
你代码的文件读取逻辑存在基础语法错误,这是任务无法正常运行的主要原因:
# 错误写法:未将打开的文件对象赋值给file变量 with open('../messages/quo.txt', 'r', encoding = 'utf-8'): txt = file.read()
正确写法补全as file即可:
with open('../messages/quo.txt', 'r', encoding = 'utf-8') as file: txt = file.read()
该错误会触发NameError: name 'file' is not defined异常,但Discord.py的tasks组件默认不会输出任务内部的异常信息,所以你看不到报错,任务第一次运行出错后就会直接终止,不会继续后续调度。
2. 相对路径适配问题
你使用的../messages/quo.txt是相对路径,路径解析基于机器人启动时的工作目录,而非Cog文件所在目录,如果启动目录和Cog目录层级不匹配,会出现文件找不到的错误。建议改为基于当前Cog文件的绝对路径:
# 先获取当前Cog文件所在的目录位置 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # 拼接得到语录文件的绝对路径 QUOTE_FILE = os.path.join(BASE_DIR, '../messages/quo.txt') with open(QUOTE_FILE, 'r', encoding='utf-8') as file: # 后续读取逻辑保持不变
3. 可选优化:添加异常日志
给task添加异常捕获逻辑,方便后续排查问题:
@dquote.after_loop async def after_dquote(self): if self.dquote.failed(): exc = self.dquote.get_task().exception() print(f"定时任务运行出错: {exc}")
4. 可选优化:启动时立即执行一次
默认tasks.loop(hours=24)会在启动后等待24小时才第一次执行任务,如果你需要启动后立刻运行一次,可以在before_dquote里增加调用:
@dquote.before_loop async def before_dquote(self): await self.client.wait_until_ready() # 启动时先执行一次任务 await self.dquote()
内容的提问来源于stack exchange,提问作者TGA
相关产品推荐
相关产品推荐

