Pycord机器人Cog编写的斜杠命令无法显示,求解决方案
Pycord Cog斜杠命令无法显示问题排查
我在Pycord机器人中使用Cog编写了斜杠命令,但无法在Discord中看到这些命令。原本尝试手动同步,后来得知Pycord现在支持自动同步,因此已开启bot.auto_sync = True,但问题仍未解决。
相关代码文件
main.py(机器人主文件)
import tracemalloc tracemalloc.start() import os import pathlib import discord from discord.ext import commands from discord import option from dotenv import load_dotenv load_dotenv() CMDS_PATH = pathlib.Path(__file__).parent / "cmds" intents = discord.Intents.default() intents.members = True bot = commands.Bot(intents=intents) bot.auto_sync = True @bot.event async def on_ready(): print(f'{bot.user} has connected to Discord!') for cmd_file in CMDS_PATH.glob("*.py"): if cmd_file.name != "__init__.py": bot.load_extension(f"cmds.{cmd_file.name[:-3]}") bot.run(os.getenv("TOKEN"))
cogs/hello.py(测试Cog文件)
import discord from discord.ext import commands class test(commands.Cog): def __init__(self, bot: discord.Bot): self.bot = bot @commands.slash_command() async def hello(self, ctx): await ctx.defer(ephemeral=True) await ctx.respond("hello", ephemeral=True) def setup(bot: discord.Bot): bot.add_cog(test(bot))
问题原因及解决方案
1. 文件夹路径不匹配(最可能原因)
主代码中指定加载cmds目录下的扩展文件,但测试Cog实际放在cogs目录中,导致机器人未加载该Cog,自然不会同步命令。
解决方法:
- 要么将Cog所在文件夹重命名为
cmds,与主代码路径保持一致; - 要么修改主代码中的路径配置:
# 修改路径指向cogs文件夹 CMDS_PATH = pathlib.Path(__file__).parent / "cogs" # 加载扩展时使用cogs前缀 bot.load_extension(f"cogs.{cmd_file.name[:-3]}")
2. Cog加载时机晚于自动同步触发
Pycord的自动同步可能在on_ready事件触发前执行,而你在on_ready中才加载Cog,导致新命令未被同步。
解决方法:
将Cog加载逻辑移到bot.run()之前,确保机器人启动时就加载所有Cog:
# 移除on_ready中的加载代码,替换为以下内容 for cmd_file in CMDS_PATH.glob("*.py"): if cmd_file.name != "__init__.py": bot.load_extension(f"cogs.{cmd_file.name[:-3]}") # 路径前缀根据实际调整 bot.run(os.getenv("TOKEN"))
3. 机器人缺少必要权限
确保机器人邀请链接包含applications.commands权限,否则无法在服务器显示斜杠命令。邀请链接需带scope=bot+applications.commands参数,示例:
https://discord.com/oauth2/authorize?client_id=你的机器人ID&scope=bot+applications.commands&permissions=所需权限值
4. 手动触发同步验证
若自动同步仍有问题,可在on_ready中手动触发同步,确认是否生效:
@bot.event async def on_ready(): print(f'{bot.user} has connected to Discord!') await bot.sync_commands() # 手动触发命令同步
内容的提问来源于stack exchange,提问作者SlowingDisc
相关产品推荐
相关产品推荐

