如何在interactions.py中实现类似discord.py的cogs功能?
interactions.py 实现类Cogs模块化指令方案
interactions.py v5及以上稳定版本原生提供Extension扩展机制,和discord.py的Cogs功能、逻辑完全对齐,支持将单个/单组指令拆分为独立文件统一加载,无需额外自行封装。
推荐目录结构
建议按如下结构组织文件,逻辑清晰便于维护:
项目根目录/ ├── main.py └── commands/ ├── __init__.py # 空文件即可,标记该目录为Python模块 ├── ping.py # 单个指令/单组相关指令的独立文件 └── user_info.py
单指令文件的必填内容
每个存放指令的独立Python文件必须包含3个核心部分,缺省任意部分都会导致加载失败:
- 依赖导入:从
interactions包导入Extension基类,以及需要用到的装饰器、类型(比如slash_command、SlashContext、选项类型等) - 扩展类:定义继承自
Extension的自定义类,类内部编写具体的指令逻辑、事件监听、组件回调;类的__init__方法必须接收client参数,完成基础初始化 - 加载入口:文件末尾必须定义名为
setup的顶层函数,接收client参数,完成扩展类的注册
举个可直接运行的commands/ping.py示例:
from interactions import Extension, slash_command, SlashContext class PingCmd(Extension): def __init__(self, client): self.client = client # 指令写法和直接写在main.py中完全一致 @slash_command(name="ping", description="查询机器人响应延迟") async def ping(self, ctx: SlashContext): await ctx.respond(f"Pong! 当前延迟:{round(self.client.latency, 2)}ms") # 固定加载入口,不可省略 def setup(client): PingCmd(client)
新增指令时只需在commands目录下新建py文件,按照上述结构编写即可,单个扩展类内可放置多个相关指令、事件监听、按钮/下拉菜单回调,无需为单个指令强制拆分文件。
main.py统一加载逻辑
在main.py中完成客户端初始化后,调用load_extension方法即可加载对应扩展,支持两种加载方式:
手动指定加载
适合指令数量较少的场景,逐个声明需要加载的模块路径:
import interactions client = interactions.Client( token="你的机器人Token", intents=interactions.Intents.DEFAULT ) # 模块路径用点分隔,对应commands目录下的ping.py、user_info.py client.load_extension("commands.ping") client.load_extension("commands.user_info") client.start()
自动遍历加载
适合指令数量较多的场景,新增指令文件后无需修改main.py代码,自动识别加载:
import interactions import os client = interactions.Client( token="你的机器人Token", intents=interactions.Intents.DEFAULT ) # 遍历commands目录下所有.py文件,排除__init__.py for filename in os.listdir("./commands"): if filename.endswith(".py") and filename != "__init__.py": client.load_extension(f"commands.{filename[:-3]}") client.start()
常见注意点
- 无需手动实例化自定义的Extension子类,
load_extension方法会自动调用文件内的setup函数完成初始化 - 扩展类内部的指令、事件、组件回调写法和全局写法完全一致,不需要做额外适配
- 需要重载/卸载指令时,直接调用
client.reload_extension(模块路径)、client.unload_extension(模块路径)即可,逻辑和discord.py的Cogs重载、卸载完全一致
内容的提问来源于stack exchange,提问作者Quarlie
相关产品推荐
相关产品推荐

