为啥我的 tasks.loop 在 Heroku 上不起作用?
Posted
技术标签:
【中文标题】为啥我的 tasks.loop 在 Heroku 上不起作用?【英文标题】:Why is my tasks.loop not working on Heroku?为什么我的 tasks.loop 在 Heroku 上不起作用? 【发布时间】:2021-05-31 16:40:46 【问题描述】:我有一个名为wednesday
的齿轮,它从images
文件夹中打印特定图像,顾名思义,每周三。然而,出于测试目的,我让循环每 30 秒运行一次,并且我已经让它在今天(星期一)而不是星期三运行。我已经尝试在我的计算机上本地运行此代码,并且它没有问题。但是,在部署到 Heroku 之后,循环根本不起作用。请记住,我还有另一个 cog 也有 tasks.loop
,它每隔几秒就会改变我的机器人的状态。然而,这个齿轮在 Heroku 上没有任何问题。正如我之前所说,这个 wednesday
cog 在我的机器上本地工作,这意味着我正在为我的机器人正确添加和加载 cog,并执行代码运行所需的其他操作。那么,为什么我的代码不能在 Heroku 上运行?
import discord, datetime
from discord.ext import commands, tasks
import json
with open('config.json') as f:
config = json.load(f)
class wednesday(commands.Cog):
def __init__(self, bot):
self.bot = bot
@tasks.loop(seconds=30)
async def time_checker(self):
self.time = datetime.datetime.now
if self.time().hour == 19:
if datetime.datetime.today().weekday() == 0: # 0 because I'm testing today which is a Monday
self.channel = await self.bot.fetch_channel(config['id'])
await self.channel.send(file=discord.File('images/wednesday_pic.png'))
@commands.Cog.listener()
async def on_ready(self):
await self.bot.wait_until_ready()
self.time_checker.start()
def setup(bot):
bot.add_cog(wednesday(bot))
我不确定为什么会这样:我认为这可能与循环有关。我在images
文件夹中有其他图像,它们可以很好地用于我拥有的其他命令,因为当我调用命令时机器人会发送它们。任何帮助将不胜感激。
【问题讨论】:
请详细说明您的问题,而不是仅仅说“这不起作用”。提供完整的追溯或错误报告,否则我们将无法提供帮助。 嗯,就是这样:没有错误。 打开图片有用吗?在heroku 图像以及所有其他文件都是从我的 GitHub 存储库部署的,因为我更改了 Heroku 上的设置,每次推送到我的存储库时都会重新部署。所以,如果我检查我的 git 存储库,我可以看到我的图像。 尝试打开文件或打印调试,你需要弄清楚代码哪里出错了,你的命令没有被执行,或者你的错误处理程序吃掉了错误或者图像没有加载. 【参考方案1】:我们需要更多调试细节。调试的时候你可能会发现错误是什么。
-
检查
requirements.txt
并确保版本已锁定。 (如果您通过 pip freeze
生成它,则可能是这种情况。如果不是:请确保您本地开发环境中的版本与 Heroku 上的版本相同。
添加更多日志。加载您的 cog
时记录。当您的任务与变量的值一起重复执行时记录。打印当前工作目录的日志 (import os; print(os.getcwd())
)
检查您的机器人可以到达多远。是不是一开始就失败了,没有上线?齿轮没有加载吗?是日常任务吗?是路径分辨率吗?
提供日志。不要切断原木。提供整个事情。它们可能看起来与您无关,但其他读者可能会发现一些东西。
您在此处提供了图像的相对路径。提供项目文件夹结构的信息。用于执行项目的命令是什么(Procfile
,也可以在日志中看到。)
【讨论】:
【参考方案2】:我已经找出导致错误的原因。 Heroku 服务器在 UTC 时区运行,而我在 PST/PDT 时区。因此,我使用 UTC 到 PDT converter 来获取我正在寻找循环以打印出图像的适当时间。这是最终代码:
import discord, datetime
from discord.ext import commands, tasks
import json
with open('config.json') as f:
config = json.load(f)
class wednesday(commands.Cog):
def __init__(self, bot):
self.bot = bot
@tasks.loop(hours=1)
async def time_checker(self):
self.channel = await self.bot.fetch_channel(config['channel'])
self.time = datetime.datetime.now
if self.time().hour == 12:
if datetime.datetime.today().weekday() == 3:
await self.channel.send(file=discord.File('images/wednesday_pic.png'))
@commands.Cog.listener()
async def on_ready(self):
await self.bot.wait_until_ready()
self.time_checker.start()
def setup(bot):
bot.add_cog(wednesday(bot))
【讨论】:
以上是关于为啥我的 tasks.loop 在 Heroku 上不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的应用无法在 Heroku 上建立 websocket 连接?
为啥我的 Django 应用程序可以在本地运行,但不能在 Heroku 上运行?