Python 添加“U命令discord.py不工作”;传递的命令必须是command的子类;
我目前正在更新我的discord bot,并希望添加新功能,允许我通过discord添加和删除命令,而无需直接修改代码 我发现已经有了一些方法(即“Bot.add\u命令”和“Bot.remove\u命令”),它们正是我想要的 “remove_command”部分工作得很好,但是我在使用add_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.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