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š 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 pošaljite 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)

Izričita prazna curl proxy postavka također nadjačava odabir proxyja iz curlove vlastite konfiguracije. Kopija okruženja čuva druge vrijednosti koje naredba može trebati. Slanje praznog okruženja umjesto toga može ukloniti putanje pretraživanja izvršnih datoteka i nepovezanu konfiguraciju aplikacije.

Za naknadne radnje u samom Python procesu, namjerno promijenite os.environ. To utječe na to što novostvorena djeca nasljeđuju; ne prepisuje okruženje nadređenog terminala niti nužno ponovno konfigurira HTTP klijente koji su već zahvatili svoje postavke.

subprocess API dokumentira argument env, a os.environ opisuje Pythonovo procesno okruženje. Ti su opsezi razlog zašto shell naredba može prijaviti uspjeh dok sljedeći zahtjev još koristi stari proxy.

Na kraju provjerite klijent koji stvarno pokrećete. Varijable okruženja jedan su konfiguracijski ulaz. Izričita proxy opcija ili vlastita konfiguracija aplikacije mogu nastaviti birati proxy nakon što te varijable nestanu.

Povezani članci