Dei følgjande kalla lagar to separate shell-prosessar:

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

Den første shellen fjernar ein variabel frå sitt eige miljø og avsluttar. Python-prosessen har framleis den opphavlege verdien. Den andre shellen arvar han igjen.

Gje barnet miljøet du hadde tenkt

Når berre éin kommando skal køyre utan arva proxyvariablar, kopier miljøet til Python 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 eksplisitte tomme curl-proxyinnstillinga overstyrer også proxyval frå curls eigen konfigurasjon. Miljøkopien bevarar andre verdiar kommandoen kan trengje. Å sende eit tomt miljø i staden kan fjerne søkjestiar for køyrbare filer og irrelevant applikasjonskonfigurasjon.

For seinare operasjonar i sjølve Python-prosessen, endre os.environ med vilje. Det påverkar kva nyoppretta barn arvar; det skriv ikkje om miljøet til foreldreterminalen og konfigurerer ikkje nødvendigvis HTTP-klientar på nytt som allereie har fanga innstillingane sine.

subprocess API dokumenterer env-argumentet, og os.environ skildrar prosessmiljøet til Python. Desse omfanga er grunnen til at ein shell-kommando kan rapportere suksess medan neste førespurnad framleis brukar den gamle proxyen.

Til slutt, sjekk klienten du faktisk køyrer. Miljøvariablar er éin konfigurasjonsinngang. Eit eksplisitt proxyval eller applikasjonen sin eigen konfigurasjon kan halde fram med å velje ein proxy etter at desse variablane er borte.

Relaterte artiklar