ReadTimeoutError根本原因是pip默认读取超时仅15秒,非网络中断而是等待数据不耐烦;需同时配置--timeout延长单次读取等待、--retries启用重试机制,并切换清华源实现稳定下载。

Read timed out 不是网络断了,是 pip 在等数据时“不耐烦”了。
它默认只愿意等 15 秒——哪怕你连上了 files.pythonhosted.org 或 pypi.tuna.tsinghua.edu.cn,只要中间某次 TCP 数据块没在 15 秒内送达,就直接抛出 ReadTimeoutError。大包(如 torch、transformers)、弱网、DNS 解析慢、TLS 握手卡顿,都可能触发它。
真正卡住的环节往往不是“连不上”,而是“连上了却收不全”。
pip install 报 ReadTimeoutError 的常见触发点
-
files.pythonhosted.org是 PyPI 官方源,国内直连普遍高延迟或被限频,哪怕 ping 得通,HTTP 响应也可能超时 - 即使用了清华源,若 DNS 解析失败(比如本地
/etc/resolv.conf配了不可用 DNS),pip 会在解析阶段卡住,但错误仍显示为Read timed out - 公司/校园网常启用了透明代理或出口防火墙,会静默丢弃部分 HTTPS 分块响应,导致 pip 认为“读取中断”
-
pip内部用的是 vendoredurllib3,如果你项目里手动升级过requests或urllib3,可能干扰 pip 自身的 HTTP 客户端行为
--timeout 和 --retries 怎么配才有效
--timeout 控制的是单次 socket 读操作等待上限,不是整个命令耗时;--retries 才决定失败后重试几次(默认仅 1 次)。
- 单独加
--timeout 60不够:一次失败就停,没机会重拉中断的 chunk - 推荐组合:
pip install --timeout 60 --retries 5 -i <a href="https://www.php.cn/link/29ab8937c72f36ca382c32ece8ca5595">https://www.php.cn/link/29ab8937c72f36ca382c32ece8ca5595</a> package_name -
--retries 5让 pip 对每个失败的下载块最多重试 5 次,接近断点续传效果 - 若用 CI 环境(如 GitHub Actions),建议额外加
--no-cache-dir,避免缓存损坏放大超时概率
永久配置比每次敲参数更可靠
临时加参数容易漏、难复用,尤其在脚本或 CI 中。用户级配置文件才是稳定基础:
- Linux/macOS:编辑
~/.pip/pip.conf,写入[global] index-url = https://www.php.cn/link/29ab8937c72f36ca382c32ece8ca5595 trusted-host = pypi.tuna.tsinghua.edu.cn timeout = 120 retries = 7
- Windows:在
%APPDATA%\pip\pip.ini里写同样内容 - 注意:
timeout = 120是全局生效的 socket 读超时,不是--default-timeout(后者已被弃用)
别用豆瓣源——它已于 2025 年底停止维护,curl -I <a href="https://www.php.cn/link/58ea66374b3faa6082d480f1214c2ad2">https://www.php.cn/link/58ea66374b3faa6082d480f1214c2ad2</a> 已返回 404。
真正容易被忽略的是:超时不是独立问题。它常和 DNS、代理、证书验证耦合。如果换源+调参后仍报错,先 curl -v <a href="https://www.php.cn/link/29ab8937c72f36ca382c32ece8ca5595requests/">https://www.php.cn/link/29ab8937c72f36ca382c32ece8ca5595requests/</a> 看底层是否真通,再排查。


















