从子目录[解决方案]将Cog对象导入Discord bot

问题描述

提前道歉,以解决这个问题(和我的代码)可能变得多么混乱和曲折。在决定在这里发布我的问题之前,我试图用尽所有可能的解决方法,但运气不佳。

我正在研究用discord.py编写的discord机器人,并将其托管在Heroku上。一切均已在Heroku上正确设置(即requirements.txt,procfile等)。我从Heroku日志中收到关于ModuleNotFoundError错误。这很奇怪,因为该代码在我的台式机,笔记本电脑甚至RPi上都能正常工作。下面是有问题的日志:

2020-08-13T16:27:38.629564+00:00 heroku[worker.1]: Starting process with command `python3 ./bot/exalted-sage.py`
2020-08-13T16:27:39.205170+00:00 heroku[worker.1]: State changed from starting to up
2020-08-13T16:27:42.106185+00:00 app[worker.1]: Traceback (most recent call last):
2020-08-13T16:27:42.106211+00:00 app[worker.1]: File "./bot/exalted-sage.py",line 20,in <module>
2020-08-13T16:27:42.106423+00:00 app[worker.1]: import dispatch
2020-08-13T16:27:42.106476+00:00 app[worker.1]: ModuleNotFoundError: No module named 'dispatch'
2020-08-13T16:27:42.222494+00:00 heroku[worker.1]: Process exited with status 1
2020-08-13T16:27:42.281076+00:00 heroku[worker.1]: State changed from up to crashed

因此,我怀疑这与我在bot程序中的处理方式有关。这是我的目录明细。我只包括我认为对解决我的问题的解决方案所必需的:

bot/
    cogs/
        daily_alert.py
        dispatch.py
    data/
        dispatcher.json
    .env
    exalted-sage.py
    settings.py
procfile
requirements.txt
runtime.txt

机器人文件exalted-sage.py。我导入每个Cog对象的方式非常奇怪,到目前为止,它对我来说一直有效,但不适用于Heroku。在exalted-sage.py中,我有一个init_cogs()函数,该函数获取要加载到机器人的齿轮的列表。该列表是从存储在dispatcher.json子目录中的data文件中获得的。从那里,我利用importlib模块将我想加载的齿轮导入机器人:

def init_cogs(bot,cog_list):
    """Add all the cogs in the given list of available cogs"""
    
    for cog in cog_list:
        importlib.import_module(cog)
        bot.add_cog(dispatch.dispatcher[cog]())

上面代码中有问题的dispatch对象来自一个导入语句,我在执行此操作的文件顶部附近:

sys.path.insert(1,settings.COGS_PATH)
import dispatch

有人对它可能有什么想法或建议吗?更重要的是,到目前为止,有没有更好的方法可以做我一直在做的事情?任何帮助将不胜感激!

Here是GitHub的仓库,如果有人有兴趣更好地查看我的代码

为了更好地理解我的问题而查看的解决方案/指南

我试图用作替代库的

解决方法

在尝试了各种建议并尝试找到替代方法之后,我最终通过使用load_extensions()方法将Cogs加载为extensions的方式找到了一种解决方法。这是我尝试将扩展加载到我的机器人的地方:discord.py rewrite: TypeError: cogs must derive from Cog

dispatcher.json文件中,我创建了一个包含Cog对象的Python模块列表。我将此列表传递给我的init_cogs()函数,然后在其上进行迭代以加载Cog参数中找到的每个cogs_list

我希望这种解决方案/解决方法可以帮助其他处于类似情况的人。