discord.py 后台任务循环的问题

Posted

技术标签:

【中文标题】discord.py 后台任务循环的问题【英文标题】:Problem with discord.py background task looping 【发布时间】:2021-03-19 20:12:50 【问题描述】:

多年来,我一直在尝试修复此错误。所以基本上我现在正在尝试用 3 种不同的方式循环任务,这是我得到的最接近的方式,但无法弄清楚为什么会发生此错误

Traceback(最近一次调用最后一次):文件“/home/jupe/.local/lib/python3.8/site-packages/discord/ext/commands/bot.py”,第 607 行,在 _load_from_module_spec spec.loader .exec_module(lib) 文件“”,第 779 行,在 exec_module 文件中“”,第 916 行,在 get_code 文件中“”,第 846 行,在 source_to_code 文件中“”,第 219 行,在 _call_with_frames_removed 文件中“/home/jupe/bot/ modules/task.py”,第 25 行 def setup(bot): ^ SyntaxError: invalid syntax上述异常是导致以下异常的直接原因: Traceback (last recent call last): File "main.py", line 12, in bot.load_extension(f'modules.filename[:-3]') File “/home/jupe/.local/lib/python3.8/site-packages/discord/ext/commands/bot.py”,第 664 行,在 load_extension self._load_from_module_spec(spec, name) 文件中“/home/jupe/ .local/lib/python3.8/site-packages/discord/ext/commands/bot.py”,第 610 行,在 _load_from_mod ule_spec raise errors.ExtensionFailed(key, e) from e discord.ext.commands.errors.ExtensionFailed: Extension 'modules.task' raise an error: SyntaxError: invalid syntax (task.py, line 25)

这个错误出现在这段代码中,应该可以正常工作

import discord
from discord.ext import commands
import asyncio
import os

class CogBackground(commands.Cog):
    
    def __init__(self, bot):
        self.bot = bot
    
    async def scan(path):
        for file in os.listdir(path):
            x=os.stat(file)
            Result=(time.time()-x.st_mtime) 
            print("The age of the given file is: ",Result)

    async def task(self, ctx):
        self.scan("imgs/")
        await asyncio.sleep(15)

    @commands.Cog.listener()
    async def on_ready(self, ctx):
        self.bot.loop.create_task(self.task(ctx)

def setup(bot):
    bot.add_cog(CogBackground(bot))

【问题讨论】:

您没有在 on_ready 函数中关闭括号。另外,我在文档中的任何地方都找不到关于“create_task”函数的任何信息,所以我认为它不应该完美工作。 discordpy.readthedocs.io/en/latest/search.html?q=create_task 在我把它移到 Cog 之前它仍然可以工作,但我会关闭支架谢谢 【参考方案1】:

on_ready 事件的第一行代码有语法错误,而且scan 函数是协程,所以你必须等待它。

await self.scan('./imgs')

一个更好的选择是使用内置的discord.ext.tasks 扩展,它只是一个更好的选择

from discord.ext import tasks

# In the cog 
@tasks.loop(seconds=15.0)
async def task(self):
    await self.scan('./imgs')

@commands.Cog.listener()
async def on_ready(self):
    self.task.start()

【讨论】:

以上是关于discord.py 后台任务循环的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 discord.py 中循环任务

Python asyncio/discord.py - 循环退出,任务被破坏,但它处于待处理状态

如何在 discord.py 机器人中正确使用任务/事件循环?

Discord.py 带线程,RuntimeError: Timeout context manager 应该在任务内部使用

Discord.py 从后台线程关闭 Bot

从后台任务中更新android UI