You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:45:01