HTTP_PROXY と http_proxy による ConfigParser DuplicateOptionError
Linux 環境では HTTP_PROXY と http_proxy が共存できるのに、ConfigParser のデフォルトとして渡すと DuplicateOptionError になる理由を整理します。
大文字と小文字を区別する環境では、HTTP_PROXY と http_proxy は別の名前になり得ます。ConfigParser は通常オプション名を小文字に変換するため、両方をデフォルトに渡すと 1 つの重複オプションになってしまいます。
そのため <dict> を名指すエラーは、プロキシ接続を試みる前に ConfigParser(defaults=os.environ) から発生することがあります。
このパーサーで大文字と小文字を区別した環境変数名がどうしても必要な場合は、読み込む前に正規化の方針を設定します:
import configparser
import os
settings = configparser.ConfigParser(interpolation=None)
settings.optionxform = str
settings.read_dict({'DEFAULT': dict(os.environ)})これで 2 つの綴りは分離されたままになります。以降の参照や読み込まれる設定もこの方針に従います。補間を無効にすると、環境変数の値に含まれるパーセント記号が補間構文として扱われることも防げます。
大文字と小文字を区別しない設定が必要な場合は、意図する環境変数を明示的に選び、パーサーに渡す前に、そのクライアントのプロキシ規則に従って競合する綴りを解決してください。
strict=False を変更すると重複は受け入れられますが、アプリケーションが競合するどちらのプロキシ値を使うべきかは定義されません。パーサーを制御できない場合は、誤って設定された環境変数の綴りを 1 つ削除するのが適切なこともあります。まず下流のクライアントが必要とする値を特定してください。