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 originalnu vrijednost. Drugi shell je ponovo nasljeđuje.

Dajte podređenom procesu okruženje koje ste namjeravali

Kada samo jedna komanda treba da se izvrši bez naslijeđenih proxy varijabli, kopirajte Python okruženje i proslijedite kopiju podređenom procesu:

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 komanda može trebati. Prosljeđivanje praznog okruženja umjesto toga može ukloniti putanje za pretragu izvršnih datoteka i nepovezanu konfiguraciju aplikacije.

Za naredne operacije unutar samog Python procesa namjerno promijenite os.environ. To utiče na ono što novoosnovani podređeni procesi nasljeđuju; ne prepisuje okruženje roditeljskog terminala niti nužno rekonfiguriše HTTP klijente koji su već zapamtili svoje postavke.

subprocess API dokumentuje argument env, a os.environ opisuje procesno okruženje Pythona. Ovi opsezi su razlog zašto shell komanda može prijaviti uspjeh dok sljedeći zahtjev još uvijek koristi stari proxy.

Na kraju, provjerite klijenta koji zapravo pokrećete. Varijable okruženja su jedan konfiguracijski ulaz. Eksplicitna proxy opcija ili vlastita konfiguracija aplikacije može nastaviti birati proxy nakon što te varijable nestanu.

Povezani članci