开发与 AI · Clash 技术博客

pip、Conda 下载超时怎么办?Python 环境使用 Clash 代理的正确方法

pip、Conda 和 git+https 各自读取不同的代理设置。先在新终端做一次临时测试,确认确实是网络问题,再决定把配置写到哪里。

  • pip
  • Conda
  • Python
  • 下载超时
本文目录

pip 或 Conda 超时,先确认真正发起下载的是谁

浏览器能打开 PyPI,不代表终端里的 pip、Conda 或 Git 已经走 Clash。先看失败命令访问的域名和发起程序,再用当前终端的临时代理做对照;临时测试成功后,才决定写入 pip、.condarc 或项目虚拟环境,并保留对应的撤销命令。

先看命令是谁发起的

命令或错误真正的下载器查看配置
python -m pip installpip / Python HTTP 库pip config debug、环境变量、--proxy
conda install / createCondaconda config --show-sources、~/.condarc
git+https://...Gitgit config --show-origin --get-regexp http.*proxy
编译阶段再下载资源包自己的构建脚本详细日志中的真实 URL

先在新终端做一次临时测试

macOS / Linux 当前终端,CLASH_PORT 按实际 mixed-port 修改
CLASH_PORT=7890
export HTTP_PROXY="http://127.0.0.1:$CLASH_PORT"
export HTTPS_PROXY="http://127.0.0.1:$CLASH_PORT"
export NO_PROXY=localhost,127.0.0.1,::1

python -m pip install --dry-run packaging
conda search python

unset HTTP_PROXY HTTPS_PROXY NO_PROXY
Windows PowerShell 当前窗口,7890 按实际 mixed-port 修改
$ClashPort = 7890
$env:HTTP_PROXY = "http://127.0.0.1:$ClashPort"
$env:HTTPS_PROXY = "http://127.0.0.1:$ClashPort"
$env:NO_PROXY = "localhost,127.0.0.1,::1"

py -m pip install --dry-run packaging

Remove-Item Env:HTTP_PROXY, Env:HTTPS_PROXY, Env:NO_PROXY

端口换成 Clash 实际 mixed-port。测试时打开客户端连接页;PyPI 或 channel 请求出现且命中预期节点,才证明命令进入代理。浏览器能访问 pypi.org 不能替代这一步。

只有 pip 需要长期使用时,再写 pip 配置

查看来源、临时使用和撤销
python -m pip config debug
python -m pip config list -v

# 单次命令,官方支持 scheme://[user:password@]host:port
python -m pip install --proxy http://127.0.0.1:7890 requests

# 若曾写入用户配置,查看后再删除
python -m pip config unset global.proxy
只给当前虚拟环境使用,并能单独撤销
# 先激活项目自己的 venv,再执行
python -m pip config --site set global.proxy http://127.0.0.1:7890
python -m pip config --site list

# 项目不再需要代理时
python -m pip config --site unset global.proxy

pip 的配置可能来自全局、用户、虚拟环境和 PIP_CONFIG_FILE。config debug 会列出文件路径,不要只编辑第一份找到的 pip.conf。

--site 会写进当前虚拟环境,适合本机项目单独使用。但 .venv 必须留在 .gitignore,requirements.txt 与 pyproject.toml 仍不应写入个人代理。

如果使用自定义 index-url,也要把超时发生在哪个域名写清。索引页面正常、wheel 文件下载失败,可能是文件 CDN 或证书路径不同。

Conda 的 proxy_servers 放在 .condarc,并检查 channel

pip 测试成功而 Conda 仍然超时,才需要查看 .condarc。Conda 会先取 channel 的 repodata,之后再下载包,所以要从详细输出里看最后失败的是哪个 channel。

~/.condarc 示例
proxy_servers:
  http: http://127.0.0.1:7890
  https: http://127.0.0.1:7890

ssl_verify: true
查来源与移除
conda config --show-sources
conda config --show proxy_servers ssl_verify channels

# 不再需要时删除整个代理映射
conda config --remove-key proxy_servers

Conda 先下载 channel 的 repodata,再取具体包。某个第三方 channel 失效时,代理设置完全正确也会 404 或超时;根据详细输出确认最后访问的 channel,不要把 defaults、conda-forge 和私有镜像一起重写。

CERTIFICATE_VERIFY_FAILED 不要用 trusted-host 或 ssl_verify: false 糊过去

检查系统时间、索引域名和是否存在企业 HTTPS 检查。组织提供 CA 文件时,pip 可以使用 --cert 或 PIP_CERT,Conda 可以把 ssl_verify 指向 CA 文件。

Conda 23.9+ 且 Python 3.10+ 还支持 ssl_verify: truststore,使用操作系统证书库。

ssl_verify: false 会让以后所有 Conda 请求跳过证书校验,不适合作为长期配置。家用网络突然出现未知 CA,应检查安全软件或代理节点,而不是安装网页推荐的根证书。

受管设备示例,路径由管理员提供
# pip 单次命令
python -m pip install --cert /path/to/company-ca.pem requests

# .condarc 二选一
ssl_verify: /path/to/company-ca.pem
# ssl_verify: truststore

依赖写着 git+https 时,回到 Git 检查

pip 遇到 git+https 依赖会调用 Git。先在项目外运行 git ls-remote 对应仓库,再用 git config --show-origin 找旧代理;需要认证的仓库通过凭据管理器或 SSH key,不把 token 写进 requirements。

PEP 517 构建隔离还可能创建临时环境并下载 build backend。加 -vvv 保存详细日志,看到真实失败 URL 后再判断是 pip、Git 还是包的构建脚本。

可直接运行的公开示例;再换成报错的仓库和包名
REPO_URL='https://github.com/pallets/flask.git'
PACKAGE_NAME='packaging'

git config --show-origin --get-regexp 'http..*.proxy|http.proxy' || true
git ls-remote "$REPO_URL"
python -m pip install -vvv "$PACKAGE_NAME"

清理后开一个全新终端验证

临时代理和永久配置都试过以后,关掉当前终端重新打开。旧环境变量只留在原窗口里,新窗口最能说明你的长期配置究竟写在了哪里。

结束条件

  • pip config debug 不再显示旧 proxy
  • conda config --show-sources 中没有无效 proxy_servers
  • 新终端的 HTTP_PROXY、HTTPS_PROXY、ALL_PROXY 均符合预期
  • pip 小包、Conda repodata 与 git+https 依赖分别测试
  • Clash 关闭后,未设置代理的 Python 命令不会继续指向 127.0.0.1 旧端口
  • 证书验证保持开启

参考资料