【发布时间】:2021-11-01 00:12:11
【问题描述】:
我正在使用 discord.py,我希望每个函数本身都是一个 python 文件。所以我在main.py 中创建机器人并将其导入我需要它的python 文件并在那里创建命令。然后在main.py 中使用bot.process_commands 处理命令。然而,这不起作用。
有没有办法我什至可以做到这一点,还是所有内容都必须放在一个文件中?
【问题讨论】:
标签: python discord.py
我正在使用 discord.py,我希望每个函数本身都是一个 python 文件。所以我在main.py 中创建机器人并将其导入我需要它的python 文件并在那里创建命令。然后在main.py 中使用bot.process_commands 处理命令。然而,这不起作用。
有没有办法我什至可以做到这一点,还是所有内容都必须放在一个文件中?
【问题讨论】:
标签: python discord.py
不,您不必在一个文件中完成所有操作。您可以使用名为Cogs 的东西。你可以观看教程,阅读 discord.py 的官方文档或阅读我的解释。
齿轮解释:
实际上,您只是打开了可以加载到机器人的辅助文件,例如,一个包含所有帮助命令的 help_commands.py 文件。
要加载命令,需要将它们分组到一个 Cog 类中,为此,您需要在该文件中定义一个继承自 Cog 类的 Main Class,例如:
class My_Help_Cog(commands.Cog): 现在,My_Help_Cog 是我们将加载到机器人的主要 Cog 类。
之后,我们需要一种方法将这个Cog 添加到机器人中。为此,discord.py 使用一个名为 setup 的函数来获取您的 Cog,当您尝试从主文件加载机器人时,discord.py 调用该 setup 函数。
所以让我们在代码末尾定义一个setup 函数。
def setup(bot):
bot.add_cog(My_Help_Cog(Bot)
一个完整的例子:
?help_commands.py?
import discord
from discord.ext import commands
class My_Help_Cog(commands.Cog, name="Help Commands"): # Our Main Cog class for writing our code. | name= is optional.
def __init__(self, bot, *args, **kwargs):
self.bot = bot # So we can access the bot in the class whenever we like.
# All the codes goes here, if you know OOP i assume you already understood.
def setup(bot): # Defining the setup so cog loader can understand what we want to add to the bot.
bot.add_cog(My_Help_Cog(Bot) # Adding to the bot part.
但是,Cogs 有一个警告。当您在 Cogs 时,您所做的事情会有所不同。
例如;当我们定义命令时,我们不再使用@client.command()(或@bot.command())装饰器来定义命令。
相反,您使用@commands.command() 作为命令装饰器。
events 也是如此,您现在可以通过@commands.Cog.listener() 而不是@bot.event 注册到events。
而且,由于我们在Class 中,您需要将self 作为您的第一个参数传递给Class 中的所有内容。
所以,我们设计了我们的Cog,最后一部分只是将它加载到主文件中。为此,您可以在主文件中使用bot 的load_extension 方法:
bot.load_extension("cog's location.") # In our example, just "help_commands.py" for the location.
与齿轮交互的方法更多,但很少:
【讨论】: