本文目錄
pip 或 Conda 超時,先確認真正發起下載的是誰
瀏覽器能開啟 PyPI,不代表終端中的 pip、Conda 或 Git 已經走 Clash。先看失敗命令存取的網域和發起程式,再用目前終端的臨時代理做對照;臨時測試成功後,才決定寫入 pip、.condarc 或專案虛擬環境,並保留對應的撤銷命令。
先看命令是誰發起的
| 命令或錯誤 | 真正的下載器 | 查看設定 |
|---|---|---|
| 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_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$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.proxypip 的設定可能來自全域、使用者、虛擬環境和 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。
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 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 舊連接埠
- 憑證驗證保持開啟
