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