Discord.py部署Heroku报错:commands无slash_command属性的解决问询
解决方案
1. 先排查依赖版本问题
你本地能用@commands.slash_command(),大概率是用了discord.py的fork版本(比如nextcord)或者额外的slash命令扩展库,但Heroku上默认装的是原生discord.py——原生discord.py的commands模块根本没有slash_command这个属性,所以报错。
先核对本地和Heroku的依赖:
- 查看本地的
requirements.txt,如果写的是nextcord而不是discord.py,那Heroku必须装nextcord,不能用原生库。 - 如果本地用的是原生discord.py还能用这个装饰器,那你肯定是装了
discord-ext-slash-command这类第三方扩展,Heroku也得同步装这个库。
2. 改用官方原生斜杠命令实现(推荐)
如果想贴合discord.py官方标准,把@commands.slash_command()换成官方的app_commands写法,兼容前缀命令的同时,避免依赖第三方扩展:
from discord import app_commands from discord.ext import commands class BotCog(commands.Cog): def __init__(self, bot): self.bot = bot # 原有的前缀命令保留不变 @commands.command() async def wallet_verify(self, ctx): # 你的Web3钱包验证逻辑 await ctx.send("正在验证钱包...") # 斜杠命令用app_commands装饰器 @app_commands.command(name="wallet_verify", description="Web3钱包验证") async def slash_wallet_verify(self, interaction): # 复用钱包验证逻辑,避免重复代码 await self._wallet_verify_logic(interaction) await interaction.response.send_message("钱包验证完成") # 抽离共享逻辑 async def _wallet_verify_logic(self, user_context): # 这里写你的Web3验证代码 pass # 加载Cog并同步斜杠命令 async def setup(bot): await bot.add_cog(BotCog(bot)) # 全局同步命令(生产环境建议按服务器同步,避免官方审核延迟) await bot.tree.sync(guild=None) # guild=None表示全局,指定guild_id则仅同步到对应服务器
3. 强制Heroku安装正确依赖
如果非要保留@commands.slash_command()写法:
- 编辑
requirements.txt,明确指定依赖库:- 用nextcord的话:
nextcord>=2.3.0 - 用discord-ext-slash-command的话:
discord.py>=1.7.3和discord-ext-slash-command>=1.7.0
- 用nextcord的话:
- 把修改后的
requirements.txt推送到Heroku,重新触发部署。
4. 检查Heroku部署日志
如果还是不行,去Heroku的部署日志里看依赖安装过程,确认有没有安装失败、版本不兼容的情况。比如有没有自动降级了库版本,导致slash_command属性消失。
内容的提问来源于stack exchange,提问作者RuffBuff
相关产品推荐
相关产品推荐

