You need to enable JavaScript to run this app. 在discord.py中如何循环执行带参数的异步函数?
优惠活动
大模型
产品
解决方案
定价
更多

在discord.py中如何循环执行带参数的异步函数?

我有一个需要无限循环执行的异步函数,代码如下:

@client.command()
async def cat(ctx):
    tempurl = "b"       
    subreddit = await reddit.subreddit("cats")
    allSubmissions = []

    new = subreddit.new(limit = 1)

    async for submission in new:
        allSubmissions.append(submission)

    randomSub = random.choice(allSubmissions)

    url = randomSub.url
    if tempurl != url:
        if url.endswith('.jpg') or url.endswith('.jpeg') or url.endswith('.png'):
            tempurl = url
            print("\n"+url)
            await ctx.send(url)

loop = asyncio.get_event_loop()
loop.run_until_complete(cat())
loop.close()

使用loop.run_until_complete(cat())执行时抛出错误:
TypeError: cat() missing 1 required positional argument: 'ctx'
尝试查找带参数异步函数的循环执行方法,未找到相关解决方案。

解决方案

无需沿用原有写法,使用discord.ext.task创建后台循环,再从命令函数中调用该后台循环函数即可,代码如下:

@tasks.loop(seconds=30)
async def catSend(ctx):
    tempurl = "bbbb"
    subreddit = await reddit.subreddit("cats")
    allSubmissions = []

    new = subreddit.new(limit = 1)
    async for submission in new:
        allSubmissions.append(submission)

    randomSub = random.choice(allSubmissions)

    url = randomSub.url
    if tempurl != url:
        if url.endswith('.jpg') or url.endswith('.jpeg') or url.endswith('.png'):
            tempurl = url
            print(url)
            await ctx.send(url)
        else:
            tempurl = url
        

@client.command()
async def cat(ctx):
    catSend.start(ctx)

内容的提问来源于stack exchange,提问作者Abhinav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 00:36:01