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 后台任务循环的问题的主要内容,如果未能解决你的问题,请参考以下文章
Python asyncio/discord.py - 循环退出,任务被破坏,但它处于待处理状态
如何在 discord.py 机器人中正确使用任务/事件循环?
Discord.py 带线程,RuntimeError: Timeout context manager 应该在任务内部使用