【问题标题】:I want to run task everyday, 00:00 (discord.py)我想每天 00:00 运行任务(discord.py)
【发布时间】:2021-03-15 09:44:04
【问题描述】:

我每天 00:00 将代码放在一起运行任务(恰好是一天变化的时间)。但这给了我一行两个错误。 coma_schedule.change_interval(hours=interval.hours, minutes=interval.minutes, seconds=interval.seconds)

AttributeError: 'datetime.timedelta' object has no attribute 'hours'
AttributeError: type object 'coma_schedule' has no attribute 'change_interval'

好吧,因为我的代码来自 discord.py 的官方 Discord 服务器的 tag(我猜类似于 snifet),它应该可以工作。我不明白为什么这会给我错误。

(几乎)完整代码

import discord
import datetime
import asyncio
import psycopg2 as pg2
from discord.ext import commands, tasks


class coma_schedule(commands.Cog, name='coma_schedule'):
    def __init__(self, bot):
        print('[COMA SCHEDULER] coma scheduler is ready')
        self.bot = bot
        self.coma_schedule.start()

    def cog_unload(self):
        self.coma_schedule.cancel()

    @tasks.loop(hours=24)
    async def coma_schedule(self):
        now = datetime.datetime.now()
        nextday = now + datetime.timedelta(days=1)
        # Do my stuff
        # Do my stuff ends

        now = datetime.datetime.now()
        interval = nextday - now
        coma_schedule.change_interval(hours=interval.hours, minutes=interval.minutes, seconds=interval.seconds)

    @coma_schedule.before_loop
    async def coma_schedule_before(self):
        now = datetime.datetime.now()
        nextday = datetime.datetime.now()
        nextday.replace(hour=0, minute=0, second=0)
        if nextday < now:
            nextday.replace(day=now.day + 1)
        await asyncio.sleep((nextday - now).total_seconds())


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

我不知道我应该只用那个 AttributeError 解决什么问题,所以我真的需要帮助。

【问题讨论】:

    标签: python scheduled-tasks discord.py


    【解决方案1】:

    对于AttributeError: 'datetime.timedelta' object has no attribute 'hours',您从另一个对象中减去datetime 对象,因此您得到一个timedelta 对象作为回报。此对象没有hours 属性:只有dayssecondsmicroseconds。因此AttributeError

    不过,在您的情况下,由于 timedelta 恰好是一天,因此 nownextday 的小时和分钟将相同,因此您可以从那里获取它们。

    对于您的第二个问题,不太清楚,但我相信您正在尝试访问名称为 change_interval 的方法。如果是这样,您尝试从对象名称 (coma_schedule) 访问函数,而不是当前实例 (self)。由于您尝试访问的函数不是静态的,因此您无法从 abc 访问它:您想改为调用 self.change_interval

    【讨论】:

    • 最后,我修改了一些代码,改成self.coma_scheduler.change_interval(hours=intervals.seconds/3600, minutes=intervals.seconds/60, seconds=intervals.seconds) Discord 服务器的某个人说我可能会隐藏变量,所以我更改了类名和函数名。感谢您的回答!
    • @tetratheta 仅供参考,一开始我还以为你在隐藏coma_schedule,因为它既是类名又是方法名,但你不是。尽管如此,最好不要让类包含与它们完全相同的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2013-11-23
    相关资源
    最近更新 更多