问题描述
提前道歉,以解决这个问题(和我的代码)可能变得多么混乱和曲折。在决定在这里发布我的问题之前,我试图用尽所有可能的解决方法,但运气不佳。
我正在研究用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的仓库,如果有人有兴趣更好地查看我的代码。
为了更好地理解我的问题而查看的解决方案/指南
- https://gist.github.com/MRobertEvers/55a989b4883ea8d7715d2e156627f034
- Not able to import module from other directory in Python 3.7.1
- Import module from subfolder
我试图用作替代库的
解决方法
在尝试了各种建议并尝试找到替代方法之后,我最终通过使用load_extensions()
方法将Cogs加载为extensions的方式找到了一种解决方法。这是我尝试将扩展加载到我的机器人的地方:discord.py rewrite: TypeError: cogs must derive from Cog
在dispatcher.json
文件中,我创建了一个包含Cog
对象的Python模块列表。我将此列表传递给我的init_cogs()
函数,然后在其上进行迭代以加载Cog
参数中找到的每个cogs_list
。
我希望这种解决方案/解决方法可以帮助其他处于类似情况的人。