Python 添加“U命令discord.py不工作”;传递的命令必须是command的子类;

Python 添加“U命令discord.py不工作”;传递的命令必须是command的子类;,python,discord.py,typeerror,Python,Discord.py,Typeerror,我目前正在更新我的discord bot,并希望添加新功能,允许我通过discord添加和删除命令,而无需直接修改代码 我发现已经有了一些方法(即“Bot.add\u命令”和“Bot.remove\u命令”),它们正是我想要的 “remove_command”部分工作得很好,但是我在使用add_command函数添加回命令时遇到了问题。我已经阅读了文档,但似乎不明白是什么导致了我的错误(如下所述) 代码: 错误: discord.ext.commands.errors.CommandInvoke

我目前正在更新我的discord bot,并希望添加新功能,允许我通过discord添加和删除命令,而无需直接修改代码

我发现已经有了一些方法(即“Bot.add\u命令”和“Bot.remove\u命令”),它们正是我想要的

“remove_command”部分工作得很好,但是我在使用add_command函数添加回命令时遇到了问题。我已经阅读了文档,但似乎不明白是什么导致了我的错误(如下所述)

代码:

错误:
discord.ext.commands.errors.CommandInvokeError:Command引发异常:TypeError:传递的命令必须是Command的子类

有人能帮帮我吗?我好像不明白这是什么意思。谢谢

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "/Users/name/Desktop/discord mj market/1 mainmarketplace.py", line 121, in addcommand
    await client.add_command(command)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/core.py", line 1132, in add_command
    raise TypeError('The command passed must be a subclass of Command')
TypeError: The command passed must be a subclass of Command

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/core.py", line 859, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/discord/ext/commands/core.py", line 94, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: The command passed must be a subclass of Command

传递给
add_command
remove_command
的参数
command
必须是一个对象。当公会成员调用该命令时,他们将向参数传递字符串(因此会出现错误消息)

有两种方法可以获取与命令名对应的
命令
对象:

  • (推荐)使用该方法。如果找不到命令,这将返回与命令名(或别名)或
    None
    对应的
    Command
    对象。注意:命令名区分大小写
  • 使用该方法。这将返回一个生成器,生成连接到
    Bot
    对象的每个
    命令
    对象
  • 至于
    add_command()
    方法,参数也必须是
    command
    对象。因此,您必须创建自己的
    command
    对象(其中需要函数
    func
    和名称
    name
    )。最好将函数定义为
    Command
    对象(使用
    Bot.Command()
    decorator)。如果是这种情况,则上述两种方法也可以使用


    Bot.get_命令()
    @client.command()
    @commands.has_权限(administrator=True)
    异步def removecommand(ctx,命令):
    cmd=client.get_命令(command)
    如果cmd为None:
    等待ctx.channel.send(f“Command`{Command}`不存在”)
    client.remove_命令(cmd)
    等待ctx.消息。添加反应('✅')
    

    Bot.walk_命令()
    @client.command()
    @commands.has_权限(administrator=True)
    异步def removecommand(ctx,命令):
    对于client.walk_命令()中的cmd:
    如果cmd.name.lower()==command.lower():
    client.remove_命令(cmd)
    等待ctx.消息。添加反应('✅')
    返回
    等待ctx.channel.send(f“Command`{Command}`不存在”)
    
    传递给
    add\u command
    remove\u command
    的参数
    command
    必须是一个对象。当你的帮会成员调用该命令时,他们将向参数传递字符串(因此出现错误消息)

    有两种方法可以获取与命令名对应的
    命令
    对象:

  • (推荐)使用该方法。如果找不到命令,这将返回与命令名(或别名)或
    None
    对应的
    Command
    对象。注意:命令名区分大小写
  • 使用该方法。这将返回一个生成器,生成连接到
    Bot
    对象的每个
    命令
    对象
  • 至于
    add_command()
    方法,参数也必须是
    command
    对象。因此,您必须创建自己的
    command
    对象(其中需要函数
    func
    和名称
    name
    )。最好将函数定义为
    Command
    对象(使用
    Bot.Command()
    decorator)。如果是这种情况,则上述两种方法也可以使用


    Bot.get_命令()
    @client.command()
    @commands.has_权限(administrator=True)
    异步def removecommand(ctx,命令):
    cmd=client.get_命令(command)
    如果cmd为None:
    等待ctx.channel.send(f“Command`{Command}`不存在”)
    client.remove_命令(cmd)
    等待ctx.消息。添加反应('✅')
    

    Bot.walk_命令()
    @client.command()
    @commands.has_权限(administrator=True)
    异步def removecommand(ctx,命令):
    对于client.walk_命令()中的cmd:
    如果cmd.name.lower()==command.lower():
    client.remove_命令(cmd)
    等待ctx.消息。添加反应('✅')
    返回
    等待ctx.channel.send(f“Command`{Command}`不存在”)
    
    discord.utils.find(lambda cmd:str(cmd)==“yourcmdname”,client.commands)

    如果存在,这将找到您的bot命令,否则返回
    None
    。此外,如果您将再次使用删除的命令,您可以禁用它

    @client.command()
    async def toggle(ctx, cmd):
        command = discord.utils.find(lambda c: str(c) == cmd, client.commands)
        if command:
            command.enabled = not command.enabled
            if command.enabled:
                await ctx.send(f"{cmd} enabled.")
            else:
                await ctx.send(f"{cmd} disabled.")
        else:
            await ctx.send("Command not found")
    
    discord.utils.find(lambda cmd:str(cmd)=“yourcmdname”,client.commands)

    如果存在,这将找到您的bot命令,否则返回
    None
    。此外,如果您将再次使用删除的命令,您可以禁用它

    @client.command()
    async def toggle(ctx, cmd):
        command = discord.utils.find(lambda c: str(c) == cmd, client.commands)
        if command:
            command.enabled = not command.enabled
            if command.enabled:
                await ctx.send(f"{cmd} enabled.")
            else:
                await ctx.send(f"{cmd} disabled.")
        else:
            await ctx.send("Command not found")
    

    您能包含完整的错误回溯吗?这将使诊断问题更容易,因为
    CommandInvokeError
    是一个非常普遍的异常。@JacobLee完成,对此表示歉意。“传递的命令必须是command的子类”正是这一部分让我感到困惑。你能包括完整的错误回溯吗?这将使诊断问题更容易,因为
    CommandInvokeError
    是一个非常普遍的例外情况。@JacobLee完成了,对此表示歉意。“传递的命令必须是command的子类”正是这一部分让我困惑了。非常感谢。然而,我刚刚意识到为什么我的“addcommand”命令不起作用。假设我有一个包含两个命令的列表:command