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

Python开发Discord机器人运行报Unclosed client session错误如何解决

错误原因

你遇到的Unclosed client session报错主要来自以下几个问题:

  • asyncpraw内部会自行维护ClientSession,你额外手动创建的ClientSession没有实际使用,属于冗余逻辑
  • 你没有主动关闭asyncpraw的Reddit实例,实例内部持有的会话没有被释放,这是报错的核心原因
  • sub.top()返回的是异步迭代器,你错误使用同步for遍历,应该用async for
  • async with包裹的ClientSession退出上下文时会自动关闭,额外调用await session.close()属于冗余操作
  • 代码中缺少reddit实例的初始化逻辑,也没有定义subreddits变量
  • 普通列表类型的subreddits不需要用async for遍历,直接用同步for即可

修复后的完整代码

import asyncpraw
import asyncio
import random

# 替换为你自己申请的Reddit API凭证
REDDIT_CLIENT_ID = "你的client_id"
REDDIT_CLIENT_SECRET = "你的client_secret"
REDDIT_USER_AGENT = "平台:应用名:版本 (by 你的Reddit用户名)"
# 你要拉取内容的子版块列表
subreddits = ["memes", "dankmemes", "wholesomememes"]

async def get_random_meme(pull_num=100):
    posts = []
    # 初始化Reddit实例
    reddit = asyncpraw.Reddit(
        client_id=REDDIT_CLIENT_ID,
        client_secret=REDDIT_CLIENT_SECRET,
        user_agent=REDDIT_USER_AGENT
    )
    try:
        for subreddit in subreddits:
            sub = await reddit.subreddit(subreddit)
            # 异步遍历帖子列表
            async for post in sub.top(limit=pull_num, time_filter="week"):
                posts.append(post.url)
        # 直接返回随机一条内容链接
        return random.choice(posts)
    finally:
        # 无论是否报错都关闭Reddit实例,释放内部会话资源
        await reddit.close()

async def main():
    meme_url = await get_random_meme()
    print(meme_url)

if __name__ == "__main__":
    asyncio.run(main())

额外说明

  • 你需要先到Reddit开发者平台申请API凭证,替换代码中对应参数才能正常调用接口
  • 如果需要频繁调用拉取meme的方法,可以把Reddit实例的初始化和关闭逻辑提到外层,避免重复创建销毁的性能开销

内容的提问来源于stack exchange,提问作者Vipek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:30:01