Python subprocess.run:1 つの子プロセスに専用のプロキシ環境を与える
1 つの子コマンドにプロキシが必要なとき、コピーした環境を subprocess.run に渡し、Python の環境を他の作業のために変えない方法を説明します。
Python プログラムは、1 つの子コマンドに専用のプロキシ環境を与えられます。継承した値をコピーし、コピーを変更して、subprocess.run に渡します。
import os
import subprocess
child_env = os.environ.copy()
child_env["https_proxy"] = "http://proxy.example:8080"
subprocess.run(
["curl", "--head", "https://www.example.com/"],
env=child_env,
check=True,
timeout=30,
)この例は curl がすでに利用できることを前提としています。HTTPS リクエストは、必要なトンネルに対応する HTTP プロキシを使えます。プロキシの認証情報を設定していないこの公開サイト確認では、HTTP プロキシ一覧の候補を例のエンドポイントの代わりに使えます。子プロセスはコピーした環境の残りも受け取り、該当するバイパス設定も引き継ぎます。
env を渡すと、この呼び出しだけがその環境を使います。コピーなので、Python プロセス内の他の作業のために os.environ を変更せずに済みます。
os.environ へ直接代入することにも意味があります。Python のプロセス環境を更新し、その後に起動する子プロセスに影響し得ます。ただし Python を起動したシェルや無関係なアプリケーション、すでに実行中の子プロセスは更新されません。
対話シェルで今後のコマンドを変えたいなら、シェル側で変更してください。起動した 1 つのツールだけ別の経路が必要なら、示したようにその環境を subprocess 呼び出しのそばに置きます。