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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 23:27:04