discord.py中如何获取命令对象对应的核心函数以提取源码?
修复discord.py源码查询命令的报错
错误根因
discord.ext.commands中的Command对象是对命令函数的封装容器,inspect.getsource仅支持处理原始函数、方法、代码对象等可追溯实体源码的目标,无法识别这类封装类。- 每个
Command实例的*callback*属性,存储了被@bot.command装饰的原始异步函数,这是inspect可直接处理的合法目标。
调整方案
- 将传入
inspect.getsource的参数从Command对象本身替换为com.callback,即可获取对应命令的源代码。 - 额外增加
inspect模块相关异常的捕获,兼容动态生成、无实体源码文件的命令,避免命令崩溃。
完整可运行代码
import inspect import discord from discord.ext import commands, tasks # 替换为你实际的bot初始化逻辑 bot = commands.Bot(command_prefix=".") @bot.command(hidden=True) @commands.is_owner() async def code(ctx, *, command_name): """Sends code of a command""" com = bot.get_command(command_name) if com is None: await ctx.reply("Bruh that isn't a command", mention_author=False) return try: # 传入命令封装的原始函数获取源码 source = inspect.getsource(com.callback) except (TypeError, OSError): await ctx.reply("无法获取该命令的源代码", mention_author=False) return try: # 标注代码块为python,discord端会显示语法高亮 await ctx.reply(f"```python\n{source}\n```", mention_author=False) except discord.HTTPException: await ctx.reply("That command's code is too long for me to send lmao", mention_author=False) print(source)
补充说明
- 对于嵌套的子命令(比如查询
cogs load这类组命令下的子命令),bot.get_command("cogs load")返回的子命令对象同样拥有callback属性,上述方案通用。 - 如果命令是通过动态代码生成、没有对应实体源码文件的,
inspect.getsource会抛出OSError,上述代码已捕获该异常并给出友好提示。
内容的提问来源于stack exchange,提问作者badpuns
相关产品推荐
相关产品推荐

