本文目錄
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 舊連接埠
- 憑證驗證保持開啟
