Seuraavat kutsut luovat kaksi erillistä shell-prosessia:

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

Ensimmäinen shell poistaa muuttujan omasta ympäristöstään ja päättyy. Python-prosessilla on yhä alkuperäinen arvo. Toinen shell perii sen uudelleen.

Anna lapselle ympäristö, jonka tarkoitit

Kun vain yhden komennon pitäisi toimia ilman perittyjä välityspalvelinmuuttujia, kopioi Pythonin ympäristö ja välitä kopio lapselle:

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)

Curlin eksplisiittinen tyhjä välityspalvelinasetus ohittaa myös curlin oman kokoonpanon välityspalvelinvalinnan. Ympäristön kopio säilyttää muita arvoja, joita komento voi tarvita. Tyhjän ympäristön välittäminen sen sijaan voi poistaa suoritettavien tiedostojen hakupolut ja sovelluksen muun kokoonpanon.

Myöhempiä toimintoja varten itse Python-prosessissa muuta os.environ tarkoituksella. Se vaikuttaa siihen, mitä juuri luodut lapset perivät; se ei kirjoita uudelleen vanhemman päätteen ympäristöä eikä välttämättä määritä uudelleen HTTP-asiakkaita, jotka ovat jo tallentaneet asetuksensa.

Subprocess-rajapinta dokumentoi env-argumentin, ja os.environ kuvaa Pythonin prosessiympäristöä. Nämä rajaukset ovat syy siihen, miksi shell-komento voi ilmoittaa onnistumisesta, vaikka seuraava pyyntö käyttää yhä vanhaa välityspalvelinta.

Tarkista lopuksi asiakas, jota todella suoritat. Ympäristömuuttujat ovat yksi kokoonpanotulo. Eksplisiittinen välityspalvelinvalinta tai sovelluksen oma kokoonpano voi valita välityspalvelimen vielä sen jälkeen, kun nuo muuttujat ovat poissa.

Aiheeseen liittyvät artikkelit