Hvorfor os.system("unset http_proxy") ikke ændrer noget
Fjern en proxyvariabel fra den rigtige Python-process, eller giv en underkommando et kontrolleret miljø.
Følgende kald opretter to separate shellprocesser:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Den første shell fjerner en variabel fra sit eget miljø og afslutter. Python-processen har stadig den oprindelige værdi. Den anden shell arver den igen.
Giv barnet det miljø, du havde tænkt
Når kun én kommando skal køre uden arvede proxyvariabler, kopiér Pythons miljø og send kopien til barnet:
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)
Den eksplicitte tomme curl-proxyindstilling tilsidesætter også proxyvalg fra curls egen konfiguration. Miljøkopien bevarer andre værdier, som kommandoen kan have brug for. At sende et tomt miljø i stedet kan fjerne stier til søgning efter eksekverbare filer og uafhængig applikationskonfiguration.
For efterfølgende handlinger i selve Python-processen skal du ændre os.environ bevidst. Det påvirker, hvad nyoprettede børn arver; det omskriver ikke den overordnede terminals miljø og omkonfigurerer ikke nødvendigvis HTTP-klienter, som allerede har hentet deres indstillinger.
subprocess-API'et dokumenterer argumentet env, og os.environ beskriver Pythons procesmiljø. Disse områder er grunden til, at en shellkommando kan rapportere succes, mens den næste anmodning stadig bruger den gamle proxy.
Til sidst skal du kontrollere den klient, du faktisk kører. Miljøvariabler er ét konfigurationsinput. En eksplicit proxyindstilling eller en applikations egen konfiguration kan fortsat vælge en proxy, efter at disse variabler er væk.