os.system("unset http_proxy") が何も変えない理由
プロキシ変数を正しい Python プロセスから削除するか、子コマンドに制御された環境を渡します。
次の呼び出しは 2 つの別々のシェルプロセスを作成します:
os.system('unset http_proxy')
os.system('curl https://example.com/')
最初のシェルは自身の環境から変数を削除して終了します。Python プロセスには元の値が残っています。2 番目のシェルは再びそれを継承します。
子に意図した環境を渡す
継承されたプロキシ変数なしで 1 つのコマンドだけを実行する必要がある場合は、Python の環境をコピーしてそのコピーを子に渡します:
import os
import subprocess
env = os.environ.copy()
for name in ('http_proxy', 'https_proxy', 'all_proxy',
'HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY'):
env.pop(name, None)
subprocess.run(['curl', '--proxy', '', 'https://example.com/'],
env=env, check=True)
curl の明示的な空のプロキシ設定は、curl 自身の設定からのプロキシ選択も上書きします。環境のコピーはコマンドが必要とする可能性のある他の値を保持します。代わりに空の環境を渡すと、実行ファイルの検索パスや無関係なアプリケーション設定が削除される可能性があります。
Python プロセス自体での後続の操作では、os.environ を意図的に変更します。それは新しく作成された子が継承するものに影響しますが、親ターミナルの環境を書き換えるものではなく、すでに設定を取り込んだ HTTP クライアントを必ずしも再設定するものではありません。
subprocess API は env 引数を文書化しており、os.environ は Python のプロセス環境を表します。これらのスコープがあるため、シェルコマンドが成功を報告しても次のリクエストは古いプロキシを使い続けます。
最後に、実際に実行しているクライアントを確認してください。環境変数は 1 つの設定入力です。明示的なプロキシオプションやアプリケーション自身の設定は、それらの変数がなくなった後もプロキシを選び続けることがあります。