開發與 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 舊連接埠
  • 憑證驗證保持開啟

參考資料