Discord Py如何发送实时Python输出 实现文生图bot进度同步推送
实现方案
方案1:拦截控制台输出自动同步(适合不想改动原有生成逻辑的场景)
你可以直接接管程序的标准输出流,把所有原本打印到控制台的内容自动同步到Discord频道,操作步骤如下:
- 先创建Discord机器人,拿到Bot Token,给机器人开放对应频道的「发送消息」「编辑消息」权限
- 用对应编程语言的Discord SDK(Python用discord.py、JS用discord.js)初始化机器人,提前获取目标发送频道的ID
- 重写程序的stdout/stderr方法,每次调用打印方法时,除了原本输出到控制台,同时调用Discord的消息发送/编辑接口同步内容
Python示例代码:
import sys import discord client = discord.Client(intents=discord.Intents.default()) CHANNEL_ID = 替换为你的频道ID progress_msg = None class DiscordOutput: def __init__(self, original_stdout): self.original_stdout = original_stdout def write(self, text): # 保留原有控制台输出 self.original_stdout.write(text) # 同步到Discord global progress_msg if client.is_ready() and text.strip(): if progress_msg is None: # 首次输出创建新消息 progress_msg = await client.get_channel(CHANNEL_ID).send(f"生成进度:\n{text}") else: # 后续输出编辑原有消息,避免刷屏 await progress_msg.edit(content=f"生成进度:\n{progress_msg.content}\n{text}") def flush(self): self.original_stdout.flush() # 替换全局标准输出 sys.stdout = DiscordOutput(sys.stdout)
注意:不要每次输出都发送新消息,尽量用编辑同一条消息的方式更新进度,避免刷爆频道
方案2:主动上报进度(更灵活,适合自定义展示格式的场景)
不用修改全局输出规则,直接在生成迭代逻辑里插入上报代码,自由度更高,还可以用Discord嵌入式卡片做更直观的展示:
- 同样先初始化Discord机器人,获取目标频道权限
- 生成任务启动时,先往Discord发送一条初始进度消息,保存该消息的ID
- 每完成一轮迭代,计算好当前进度、剩余时长、生成速度等参数,调用编辑消息接口更新内容
Python示例代码:
# 生成任务启动时创建初始进度卡片 embed = discord.Embed(title="AI画图生成中", color=0x00ff00) embed.add_field(name="当前迭代", value="0/50", inline=True) embed.add_field(name="生成速度", value="0it/s", inline=True) embed.add_field(name="剩余时长", value="计算中", inline=True) progress_msg = await channel.send(embed=embed) # 每轮迭代结束后调用更新 def update_progress(current_iter, total_iter, speed): remaining = (total_iter - current_iter) / speed new_embed = discord.Embed(title="AI画图生成中", color=0x00ff00) new_embed.add_field(name="当前迭代", value=f"{current_iter}/{total_iter}", inline=True) new_embed.add_field(name="生成速度", value=f"{speed:.2f}it/s", inline=True) new_embed.add_field(name="剩余时长", value=f"{remaining:.1f}s", inline=True) await progress_msg.edit(embed=new_embed)
注意事项
- 调用Discord接口的间隔不要低于1秒,否则会触发限流导致机器人被临时禁言
- 多任务同时生成时,可以给每个任务单独创建一条进度消息,用任务ID区分
- 生成完成后可以直接编辑同一条进度消息,附上最终生成的图片,不需要额外发送新消息
内容的提问来源于stack exchange,提问作者Frikallo
相关产品推荐
相关产品推荐

