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 har fortsatt den opprinnelige verdien. Den andre shellen arver den igjen.

Gi barnet miljøet du hadde tenkt

Når bare én kommando skal kjøre uten arvede proxyvariabler, kopier 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 eksplisitte tomme curl-proxyinnstillingen overstyrer også proxyvalg fra curls egen konfigurasjon. Miljøkopien bevarer andre verdier kommandoen kan trenge. Å sende et tomt miljø i stedet kan fjerne søkestier for kjørbare filer og irrelevant applikasjonskonfigurasjon.

For senere operasjoner i selve Python-prosessen, endre os.environ bevisst. Det påvirker hva nyopprettede barn arver; det skriver ikke om foreldreterminalens miljø og omkonfigurerer ikke nødvendigvis HTTP-klienter som allerede har fanget innstillingene sine.

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

Til slutt, sjekk klienten du faktisk kjører. Miljøvariabler er én konfigurasjonsinngang. Et eksplisitt proxyvalg eller applikasjonens egen konfigurasjon kan fortsette å velge en proxy etter at disse variablene er borte.

Relaterte artikler