Pycord发送ephemeral消息报错:send()存在意外关键字参数ephemeral
问题描述
按照公开技术文档编写代码,预期实现发送ephemeral(仅触发命令用户可见的临时隐藏)消息功能,核心代码如下:
await ctx.send('Message Sent ✅', ephemeral=True)
实际运行代码时抛出如下异常:
Ignoring exception in command message: Traceback (most recent call last): File "/home/runner/bot/venv/lib/python3.8/site-packages/discord/commands/core.py", line 126, in wrapped ret = await coro(arg) File "/home/runner/bot/venv/lib/python3.8/site-packages/discord/commands/core.py", line 860, in _invoke await self.callback(ctx, **kwargs) File "main.py", line 39, in _slash await ctx.send('Message Sent ✅', ephemeral=True) TypeError: send() got an unexpected keyword argument 'ephemeral'
同一段代码在其他开发者的运行环境中可正常执行,本地无法定位问题根因。
当前运行环境
- Python 版本:3.8
- Pycord 版本:当日早间从 dev 分支直接安装的开发版本
排查思路与解决方法
按优先级从高到低排查:
- 校验运行时实际加载的依赖版本
很多环境会出现虚拟环境未激活、同时安装discord.py与Pycord、装包路径和运行路径不一致的问题,导致实际运行时加载的是不支持ephemeral参数的旧版discord库。在代码启动位置加入以下打印逻辑,确认加载的库信息:
如果打印的版本号低于2.0,或者路径对应的库不是Pycord,先卸载所有冲突的discord相关依赖,再重新安装。import discord print(discord.__version__) print(discord.__file__) - 校验上下文对象类型
ephemeral参数仅支持应用命令(斜杠命令、用户命令、消息命令)的ApplicationContext上下文,如果你混用了传统前缀命令的Context对象,其send方法本身就不支持该参数。检查报错位置对应的命令装饰器,确认命令是通过@bot.slash_command()等应用命令装饰器定义,而非@bot.command()定义的传统前缀命令。 - 修复dev分支安装异常
如果确认加载的是Pycord但仍报错,说明dev分支安装时拉取了旧提交、或者本地缓存了旧构建,执行以下命令强制清理重装:
卸载步骤必须执行,避免残留旧版本文件导致冲突。pip uninstall -y discord.py py-cord pip install -U --pre py-cord - 兼容写法兜底
部分早期Pycord dev版本中,ctx.send是后续补充的别名方法,原生的临时消息响应接口为ctx.respond,可直接替换代码做兼容:
该写法在所有Pycord 2.0+版本中均支持,兼容性优于await ctx.respond('Message Sent ✅', ephemeral=True)ctx.send。
内容的提问来源于stack exchange,提问作者poppy
相关产品推荐
相关产品推荐

