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

如何将discord.py斜杠命令拆分到独立.py文件中?

如何将discord.py斜杠命令拆分到独立文件中

对于大型Discord机器人,将命令按功能拆分到独立文件是保持代码可维护性的关键。以下是具体实现方案,同时解决你之前分组命令无法运行的问题:

1. 搭建项目结构

先整理目录,把命令模块放到专门的cogs文件夹下:

your_bot/
├── main.py          # 主程序入口
└── cogs/
    ├── __init__.py  # 空文件,标记为Python包
    ├── test_cmds.py # 测试相关命令
    └── utility_cmds.py # 工具类命令

2. 编写独立的命令模块

以cogs/test_cmds.py为例,在这里定义命令分组和单个命令,并提供一个setup函数用于主程序注册:

import discord
from discord import app_commands

# 定义命令分组
test_group = app_commands.Group(
    name="test_group", 
    description="测试分组的功能描述"
)

# 给分组添加子命令
@test_group.command(
    name="subcmd", 
    description="分组内的测试子命令"
)
async def test_subcommand(interaction: discord.Interaction):
    await interaction.response.send_message("这是分组里的子命令!")

# 定义全局独立命令(不属于任何分组)
@app_commands.command(
    name="global_test", 
    description="全局测试命令"
)
async def global_test_cmd(interaction: discord.Interaction):
    await interaction.response.send_message("这是全局命令!")

# 注册函数:主程序会调用该函数把命令添加到机器人的命令树
async def setup(client: discord.Client):
    # 注册分组到命令树
    client.tree.add_command(test_group)
    # 注册全局命令到命令树
    client.tree.add_command(global_test_cmd)

3. 修改主程序加载所有命令模块

更新main.py,让它在启动时自动加载cogs文件夹下的所有命令模块,并完成命令同步:

import discord
import asyncio
import os
import importlib

class MyClient(discord.Client):
    def __init__(self, *, intents: discord.Intents):
        super().__init__(intents=intents)
        self.tree = app_commands.CommandTree(self)

    async def setup_hook(self):
        # 先加载所有命令模块
        await self.load_all_cogs()
        # 同步命令到Discord服务器
        await self.tree.sync()

    async def load_all_cogs(self):
        # 遍历cogs文件夹下的所有Python文件
        for filename in os.listdir("./cogs"):
            if filename.endswith(".py") and filename != "__init__.py":
                # 动态导入模块
                module_path = f"cogs.{filename[:-3]}"
                module = importlib.import_module(module_path)
                # 调用模块的setup函数注册命令
                if hasattr(module, "setup"):
                    await module.setup(self)

# 配置机器人权限(根据需求开启)
intents = discord.Intents.default()
# 如果需要处理消息内容,开启该权限
# intents.message_content = True

client = MyClient(intents=intents)

# 基础登录事件
@client.event
async def on_ready():
    print(f"已登录:{client.user.name}(ID: {client.user.id})")

async def main():
    # 替换为你的机器人Token
    BOT_TOKEN = "YOUR_BOT_TOKEN"
    async with client:
        await client.start(BOT_TOKEN)

asyncio.run(main())

4. 解决你之前分组命令失败的常见原因

  • 注册时机错误:之前可能在客户端初始化完成前就尝试访问client.tree,通过setup_hook和模块的setup函数,能保证客户端完全初始化后再注册命令。
  • 未同步命令:必须调用self.tree.sync()才能让Discord服务器识别新的命令和分组,且该操作要在所有命令注册完成后执行。
  • 命名不符合规范:Discord斜杠命令/分组名称必须全小写,用连字符分隔(如test-group),不能用大写或下划线。
  • 模块未正确导入:确保cogs文件夹下有__init__.py,且主程序的路径正确(比如main.py和cogs在同一目录下)。

内容的提问来源于stack exchange,提问作者georgielang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:35:01