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

Nextcord斜杠命令开发报错:AttributeError: commands模块无Option属性

问题:Nextcord斜杠命令启动报错AttributeError: module 'nextcord.ext.commands' has no attribute 'Option'

启动仅使用斜杠命令的Nextcord机器人时出现如下错误:

Failed to load slash SetupSlash: Extension 'slash.SetupSlash' raised an error: AttributeError: module 'nextcord.ext.commands' has no attribute 'Option'

尝试将@nextcord.slash_command改为@commands.slash_command后仍无法正常运行,相关代码如下:

import nextcord
from nextcord.ext import commands
from nextcord import Interaction

class Setup(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    # Welcome Message
    @nextcord.slash_command(
        description="Set the welcome channel for the server",
        options=[
            commands.Option(
                name="channel_id",
                description="ID of the welcome channel",
                type=commands.OptionType.string,
                required=True
            )
        ]
    )
    async def setwelcome(self, ctx: commands.Context, channel_id: str):
        # Check if the user who triggered the command has administrator permissions
        if not ctx.author.guild_permissions.administrator:
            await ctx.send("You need administrator permissions to use this command.", ephemeral=True)
            return

        # Check if the specified channel exists
        channel = ctx.guild.get_channel(int(channel_id))
        if not channel:
            await ctx.send("The specified channel does not exist in this server.", ephemeral=True)
            return

        # Save the channel ID as the welcome channel for the server
        self.bot.settings[ctx.guild.id]["welcome_channel"] = int(channel_id)
        # Save the settings, for example, in a JSON file or a database

        await ctx.send(f"Welcome messages will now be sent to {channel.mention}")

    # You can add a welcome message handling function here
    @commands.Cog.listener()
    async def on_member_join(self, member):
        guild = member.guild

        # Check if the welcome channel is set for this server
        if guild.id in self.bot.settings and "welcome_channel" in self.bot.settings[guild.id]:
            welcome_channel_id = self.bot.settings[guild.id]["welcome_channel"]
            welcome_channel = guild.get_channel(welcome_channel_id)

            if welcome_channel:
                avatar_url = member.avatar.url if member.avatar else member.default_avatar.url

                embed = nextcord.Embed(
                    title=f"Welcome to {guild.name}, {member.name}!",
                    description=f"{member.mention} We're glad to have you here. :tada:\n\n"
                                "If you have any questions or need assistance, feel free to ask. "
                                "Please remember to read the rules and enjoy your stay!",
                    color=nextcord.Color.blue()
                )

                embed.set_thumbnail(url=avatar_url)

                await welcome_channel.send(embed=embed)
            else:
                print(f"Could not find the welcome channel with ID: {welcome_channel_id}")

def setup(bot):
    bot.add_cog(Setup(bot))
解决方案

1. 修正Option的导入与定义方式

commands模块中不存在Option和OptionType,需从nextcord直接导入;同时Nextcord推荐使用@nextcord.slash_command配合@option装饰器定义参数,而非在slash_command中传入options列表。

2. 修正斜杠命令的上下文类型

斜杠命令的上下文应为nextcord.Interaction而非commands.Context,后者是传统前缀命令的上下文对象。

3. 调整权限检查与消息发送方式

使用interaction.user获取触发命令的用户,发送消息需用interaction.send()而非ctx.send()。

修改后的完整代码

import nextcord
from nextcord.ext import commands
from nextcord import Interaction, Option, OptionType

class Setup(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    # Welcome Message
    @nextcord.slash_command(description="Set the welcome channel for the server")
    @nextcord.option(
        name="channel",
        description="Select the welcome channel",
        type=OptionType.channel,
        required=True
    )
    async def setwelcome(self, interaction: Interaction, channel: nextcord.TextChannel):
        # Check if the user who triggered the command has administrator permissions
        if not interaction.user.guild_permissions.administrator:
            await interaction.send("You need administrator permissions to use this command.", ephemeral=True)
            return

        # Save the channel ID as the welcome channel for the server
        if interaction.guild.id not in self.bot.settings:
            self.bot.settings[interaction.guild.id] = {}
        self.bot.settings[interaction.guild.id]["welcome_channel"] = channel.id
        # Save the settings, for example, in a JSON file or a database

        await interaction.send(f"Welcome messages will now be sent to {channel.mention}")

    # Welcome message handling function
    @commands.Cog.listener()
    async def on_member_join(self, member):
        guild = member.guild

        # Check if the welcome channel is set for this server
        if guild.id in self.bot.settings and "welcome_channel" in self.bot.settings[guild.id]:
            welcome_channel_id = self.bot.settings[guild.id]["welcome_channel"]
            welcome_channel = guild.get_channel(welcome_channel_id)

            if welcome_channel:
                avatar_url = member.avatar.url if member.avatar else member.default_avatar.url

                embed = nextcord.Embed(
                    title=f"Welcome to {guild.name}, {member.name}!",
                    description=f"{member.mention} We're glad to have you here. :tada:\n\n"
                                "If you have any questions or need assistance, feel free to ask. "
                                "Please remember to read the rules and enjoy your stay!",
                    color=nextcord.Color.blue()
                )

                embed.set_thumbnail(url=avatar_url)

                await welcome_channel.send(embed=embed)
            else:
                print(f"Could not find the welcome channel with ID: {welcome_channel_id}")

def setup(bot):
    bot.add_cog(Setup(bot))

额外优化:将参数从channel_id字符串改为直接选择channel对象,无需用户手动输入ID,提升易用性,同时避免字符串转整数的潜在错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:02:03