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

Python HTTP响应流提前关闭问题:readline读取失败原因排查

问题根源分析:流式读取时底层流提前关闭

你的代码在第一次readline()后触发流关闭的核心原因有两点:

  1. requests.Response对象被提前垃圾回收
    当你创建reader = io.TextIOWrapper(response.raw, encoding="utf-8")后,代码里没有再对response对象进行引用操作。Python的垃圾回收机制会自动回收不再被引用的对象,而requests的Response对象在被销毁时,会自动关闭绑定的response.raw底层流(这是requests连接池管理的一部分,避免资源泄漏)。第一次readline()执行完成后,response可能已经被回收,导致第二次读取时流已关闭。

  2. TextIOWrapper的缓冲特性加剧问题
    io.TextIOWrapper是带缓冲的文本流包装器,第一次readline()可能会从底层response.raw读取比单行更多的数据填充缓冲。这种情况下,requests的连接管理可能误判响应处理已完成,提前回收连接并关闭流。

验证与修复

你可以通过显式保留response对象的引用来避免这个问题:

import requests
import io

url = "https://drive.google.com/uc?id=1P2hMOGgz9tEN5DYb7rqTE0MeTbgb1Pd5"
response = requests.get(url, stream=True)
reader = io.TextIOWrapper(response.raw, encoding="utf-8")
_ = response  # 强制保留response引用,防止被垃圾回收
line1 = reader.readline()
line2 = reader.readline()
print(line1.strip(), line2.strip())

这段代码能正常读取多行内容,因为response不会被提前回收,底层流也能保持打开状态。

为什么iter_lines()可行?

requests.Response.iter_lines()方法内部会持续持有response对象的引用,同时专门针对HTTP流式传输做了优化:

  • 处理分块编码等HTTP流式细节
  • 确保在迭代过程中底层流的生命周期与迭代过程绑定,不会被提前关闭

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:28:19