Følgende kall oppretter to separate shell-prosesser:

os.system('unset http_proxy')
os.system('curl https://example.com/')

Den første shellen fjerner en variabel fra sitt eget miljø og avslutter. Python-prosessen beholder den opprinnelige verdien. Den andre shellen arver den på nytt.

Gi barneprosessen miljøet du mente

Når bare én kommando skal kjøre uten arvede proxyvariabler, kopier Pythons miljø og send kopien til barneprosessen:

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 eksplisitte tomme curl-proxyinnstillingen overstyrer også proxyvalget fra curls egen konfigurasjon. Miljøkopien bevarer andre verdier kommandoen kan trenge. Et tomt miljø i stedet kan fjerne søkestier for kjørbare filer og urelatert applikasjonskonfigurasjon.

For senere operasjoner i Python-prosessen selv, endre os.environ med vilje. Det påvirker hva nyopprettede barneprosesser arver; det skriver ikke om foreldreterminalens miljø og omkonfigurerer ikke nødvendigvis HTTP-klienter som allerede har tatt opp innstillingene sine.

subprocess API dokumenterer env-argumentet, og os.environ beskriver Pythons prosessmiljø. Disse ulike omfangene er grunnen til at en shell-kommando kan rapportere suksess mens den neste forespørselen fortsatt bruker den gamle proxyen.

Til slutt bør du sjekke klienten du faktisk kjører. Miljøvariabler er bare én konfigurasjonsinngang. Et eksplisitt proxy-alternativ eller applikasjonens egen konfigurasjon kan fortsette å velge proxy etter at disse variablene er borte.

Relaterte artikler