本文目录
Python 环境里的下载不一定跟随浏览器代理,反复添加永久设置还可能让工具继续连接旧端口。先在一个新终端测试原来的命令,确认请求是否进入客户端,再决定给哪个工具保存设置;下载错误和证书错误分开处理,结束后也能清理测试留下的代理。
pip、Conda 与 Git 下载失败,代理配置分别在哪里?
记下 pip、Conda 或 Git 的失败命令和域名,再对照下表查配置。用当前终端的临时代理重试原请求,在 Clash 中看到连接记录且下载成功后再保存长期设置,并保留撤销命令;浏览器能打开 PyPI,不能替代这些检查。
失败命令与代理配置入口
| 命令或错误 | 真正的下载器 | 查看配置 |
|---|---|---|
| python -m pip install | pip / Python HTTP 库 | pip config debug、环境变量、--proxy |
| conda install / create | Conda | 命令:conda config --show-sources;文件:~/.condarc |
| git+https://... | Git | git config --show-origin --get-regexp http.*proxy |
| 编译阶段再下载资源 | 包自己的构建脚本 | 详细日志中的真实 URL |
当前终端的临时代理测试,结束后可直接撤销
端口换成 Clash 实际 mixed-port。测试时打开客户端连接页;PyPI 或 channel 请求出现且命中预期节点,才证明命令进入代理。浏览器能访问 pypi.org 不能替代这一步。
下面的示例只适用于没有旧代理设置的临时终端。先检查大小写不同的 HTTP_PROXY、HTTPS_PROXY、NO_PROXY 和 ALL_PROXY,再用后文的 pip config debug 与 conda config --show-sources 查看工具配置来源。
任何来源已有代理时,先保存原值和配置位置,按后文分别处理,不直接运行下面的覆盖与删除命令。公司规定的代理保持原样;新开窗口也可能继承旧变量,不能只凭“新窗口”认定没有配置。
确认没有旧代理来源后再运行示例,结束时只删除本次新增的变量并关闭临时窗口。原窗口和持久配置不随之改变;若曾手动更改已有值,要按记录恢复,不能靠 unset 或删除变量代替恢复。
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 --ignore-installed --no-cache-dir packaging
conda search python
unset HTTP_PROXY HTTPS_PROXY NO_PROXY$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 --ignore-installed --no-cache-dir packaging
Remove-Item Env:HTTP_PROXY, Env:HTTPS_PROXY, Env:NO_PROXY单次 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 --user 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.proxypip 的配置可能来自全局、用户、虚拟环境和 PIP_CONFIG_FILE。config debug 会列出文件路径,不要只编辑第一份找到的 pip.conf。
--site 会写进当前虚拟环境,适合本机项目单独使用。但 .venv 必须留在 .gitignore,requirements.txt 与 pyproject.toml 仍不应写入个人代理。
如果使用自定义 index-url,也要把超时发生在哪个域名写清。索引页面正常、wheel 文件下载失败,可能是文件 CDN 或证书路径不同。
Conda 的 proxy_servers 放在 .condarc,并检查 channel
proxy_servers:
http: http://127.0.0.1:7890
https: http://127.0.0.1:7890
ssl_verify: trueconda config --show-sources
conda config --show proxy_servers ssl_verify channels
# 不再需要时删除整个代理映射
conda config --remove-key proxy_serversConda 先下载 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、Conda 和 Git 能否正常下载?
结束条件
- 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 旧端口
- 证书验证保持开启
