Miksi os.system("unset http_proxy") ei muuta mitään
Poista välityspalvelinmuuttuja oikeasta Python-prosessista tai anna alikomennolle hallittu ympäristö.
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.