既存のプロビジョニングスクリプトで pip をプロキシ経由で実行する必要がある場合は、pip を subprocess として起動します。pip の内部 Python 関数はサポートされたアプリケーション API ではありません。

import subprocess
import sys

subprocess.run([
    sys.executable,
    '-m', 'pip', 'install',
    '--proxy', 'http://proxy.example:8080',
    'example-package',
], check=True)

意図したパッケージとプロキシのエンドポイントを使用します。公開された中継を経由して許可される公開パッケージのダウンロードには、HTTP プロキシ一覧 が HTTP プロキシ引数の候補を提供します。sys.executable はスクリプトを実行している Python インタープリターを選択するため、PATH から別のインストールの pip を誤って呼び出すことを避けられます。

各引数は個別のリスト要素を占めます。シェルは不要で、プロキシ URL に余分なシェル引用符の組を埋め込む必要もありません。check=True はインストールが失敗すると CalledProcessError を送出するため、プロビジョニングのワークフローでその失敗を処理できます。

ダウンロード経路は、この pip 呼び出しまたはその subprocess 環境で設定します。親プログラムの別の場所で設定された Requests セッションは、pip の別プロセスを設定しません。

インストール後は、アプリケーションの通常の環境ライフサイクルを続けます。すでに実行中のインタープリターにインストールしても、その現在のインポート、キャッシュ、パスが新しいパッケージを直ちに反映するとは限りません。

関連記事