Python开发Discord机器人运行报Unclosed client session错误如何解决
错误原因
你遇到的Unclosed client session报错主要来自以下几个问题:
asyncpraw内部会自行维护ClientSession,你额外手动创建的ClientSession没有实际使用,属于冗余逻辑- 你没有主动关闭
asyncpraw的Reddit实例,实例内部持有的会话没有被释放,这是报错的核心原因 sub.top()返回的是异步迭代器,你错误使用同步for遍历,应该用async forasync 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
相关产品推荐
相关产品推荐

