Zašto os.system("unset http_proxy") ništa ne mijenja
Uklonite proxy varijablu iz ispravnog Python procesa ili dajte podređenoj naredbi kontrolirano okruženje.
Sljedeći pozivi stvaraju dva odvojena shell procesa:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Prvi shell uklanja varijablu iz vlastitog okruženja i završava. Python proces još uvijek ima izvornu vrijednost. Drugi shell je ponovno nasljeđuje.
Dajte djetetu okruženje koje ste namjeravali
Kada samo jedna naredba treba raditi bez naslijeđenih proxy varijabli, kopirajte Python okruženje i predajte kopiju djetetu:
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)
Eksplicitna prazna curl proxy postavka također nadjačava odabir proxyja iz curlove vlastite konfiguracije. Kopija okruženja čuva druge vrijednosti koje naredbi mogu trebati. Predaja praznog okruženja umjesto toga može ukloniti putanje pretraživanja izvršnih datoteka i nepovezanu konfiguraciju aplikacije.
Za daljnje operacije u samom Python procesu, namjerno mijenjajte os.environ. To utječe na ono što nasljeđuju novo stvorena djeca; ne prepisuje okruženje roditeljskog terminala niti nužno ponovno konfigurira HTTP klijente koji su već preuzeli svoje postavke.
subprocess API dokumentira env argument, a os.environ opisuje procesno okruženje Pythona. Ti su različiti opsezi razlog zašto shell naredba može prijaviti uspjeh dok sljedeći zahtjev još uvijek koristi stari proxy.
Na kraju, provjerite klijent koji zapravo pokrećete. Varijable okruženja samo su jedan konfiguracijski ulaz. Eksplicitna proxy opcija ili vlastita konfiguracija aplikacije može nastaviti birati proxy nakon što te varijable nestanu.