You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:01:07