開発と AI · Clash 技術ブログ

pip、Conda のダウンロードがタイムアウトする場合は?Python 環境で Clash プロキシを正しく使う方法

pip、Conda、git+https はプロキシ設定の取得元が異なります。新しいターミナルの一時的な設定で元の要求をテストし、名前解決、接続、証明書のエラーから原因を探します。有効と確認してから該当ツールに保存し、解除方法も残します。

  • pip
  • Conda
  • Python
  • ダウンロードのタイムアウト
目次

Python 環境のダウンロードがブラウザーのプロキシに従うとは限りません。永続設定を何度も追加すると、古いポートを参照し続ける場合もあります。新しいターミナルで元のコマンドを試し、リクエストがクライアントに届くか確認してから、どのツールに設定を保存するか決めます。ダウンロードと証明書のエラーは分けて扱い、テスト用のプロキシを消す方法も残します。

pip、Conda、Git のダウンロードが失敗したとき、プロキシ設定はどこ?

pip、Conda、Git の失敗したコマンドとドメインを記録し、下の表で設定場所を確認します。現在のターミナルだけの一時プロキシで元のリクエストを再試行し、Clash の接続記録に表示され、ダウンロードにも成功してから永続設定を保存してください。取り消し用のコマンドも残します。ブラウザーで PyPI を開けても、この確認の代わりにはなりません。

失敗したコマンドとプロキシの設定箇所

コマンドまたはエラー実際にダウンロードを行うプログラム設定を確認する
python -m pip installpip / Python の HTTP ライブラリpip config debug、環境変数、--proxy
conda install / createCondaコマンド:conda config --show-sources;ファイル:~/.condarc
git+https://...Gitgit 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や変数の削除を復元の代わりにしないでください。

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 --ignore-installed --no-cache-dir 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 --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.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 も確認する

~/.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 が表示された場合は、Web ページで勧められたルート証明書をインストールするのではなく、セキュリティソフトまたはプロキシノードを確認してください。

管理対象端末での例。パスは管理者から提供されたものを使用する
# 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 ポートを参照し続けない
  • 証明書検証が有効なままである

参考資料