0

0

Discord.py 中 @tasks.loop 启动失败的常见原因及修复方案

心靈之曲

心靈之曲

发布时间:2026-01-18 11:57:34

|

393人浏览过

|

来源于php中文网

原创

Discord.py 中 @tasks.loop 启动失败的常见原因及修复方案

在使用 `discord.py` 的 `@tasks.loop` 时,若 cog 初始化后任务未正确启动,常因 `bot.add_cog()` 未被 `await` 调用导致 `typeerror: object nonetype can't be used in 'await' expression` —— 根本原因是 `add_cog()` 自 v2.0 起已是异步方法,必须显式 `await`。

该错误通常出现在将含 @tasks.loop 的 Cog 作为扩展(extension)加载时。你的 loop.py 文件中定义了 setup() 函数,但旧写法 bot.add_cog(loop(bot)) 在 discord.py v2.0+ 中会返回一个协程对象(而非直接执行),而你未 await 它,导致协程被丢弃,进而引发运行时警告和后续 NoneType 错误。

✅ 正确做法是:将 setup 函数声明为 async,并 await bot.add_cog(...):

# loop.py(修正后)
from discord.ext import commands, tasks
from datetime import time

class LoopCog(commands.Cog):  # 建议使用 PascalCase 类名
    def __init__(self, bot):
        self.bot = bot
        self.check.start()  # ✅ 任务在实例化时立即启动

    @tasks.loop(time=time(11, 40))  # 每天 11:40 执行
    async def check(self):
        print(f"[{datetime.now().strftime('%H:%M:%S')}] Running scheduled task...")
        # ✅ 此处添加你的业务逻辑,例如发送消息、检查状态等
        # 注意:若需访问频道/用户,请确保 bot 已就绪且权限充足

    @check.before_loop
    async def before_check(self):
        await self.bot.wait_until_ready()  # ⚠️ 关键!避免在 bot 就绪前执行任务

def setup(bot):
    # ✅ 必须是 async + await(discord.py v2.0+ 强制要求)
    return bot.add_cog(LoopCog(bot))

⚠️ 重要说明:

  • setup() 函数必须返回 bot.add_cog(...) 协程(不能 await 后返回 None),因为 load_extension() 内部会自动 await 它;
  • 若你手动 await bot.add_cog(...),会导致 RuntimeWarning: coroutine was never awaited —— 因为 load_extension() 会再次尝试 await 一个 None;
  • 因此标准写法是:setup 为普通函数,直接返回协程对象(不加 await),由框架负责调度;
  • 同时务必添加 @check.before_loop 钩子并调用 bot.wait_until_ready(),否则 check() 可能在 on_ready 前触发,导致 self.bot.user 等属性为 None。

? 补充建议:

  • 在 bot.py 中,推荐使用 async def setup_hook(self) 替代 on_ready 来加载扩展(更符合 v2.0+ 最佳实践):

    AI at Meta
    AI at Meta

    Facebook 旗下的AI研究平台

    下载
    class MyBot(commands.Bot):
        def __init__(self):
            super().__init__(command_prefix='.', intents=discord.Intents.all())
    
        async def setup_hook(self):
            await self.load_extension("loop")
            print("loop extension loaded.")
    
        async def on_ready(self):
            print(f'{self.user} is now running!')
  • 检查 loop.py 是否位于 bot.py 同级目录,且文件名不含非法字符(如开头数字、空格);

  • 运行前确认已安装兼容版本:pip install -U discord.py(推荐 ≥ 2.3.2)。

遵循以上修正,@tasks.loop 将稳定启动,不再出现 NoneType await 错误。

相关专题

更多
pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

338

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

409

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

754

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

342

2025.07.23

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

84

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

24

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

16

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号