開発と 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 が表示された場合は、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 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 ポートを参照し続けない
  • 証明書検証が有効なままである

参考資料