Zakaj os.system("unset http_proxy") ne spremeni ničesar
Odstranite spremenljivko proxy iz pravega procesa Python ali podrejenemu ukazu zagotovite nadzorovano okolje.
Naslednji klici ustvarijo dva ločena lupinska procesa:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Prva lupina odstrani spremenljivko iz svojega okolja in se konča. Proces Python ima še vedno prvotno vrednost. Druga lupina jo znova podeduje.
Podrejenemu procesu dajte okolje, ki ste ga nameravali
Če naj brez podedovanih spremenljivk proxy teče samo en ukaz, kopirajte okolje Pythona in kopijo posredujte podrejenemu 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)
Izrecna prazna nastavitev proxy v curl prepiše tudi izbiro proxy iz lastne konfiguracije curl. Kopija okolja ohrani druge vrednosti, ki jih ukaz morda potrebuje. Če namesto tega posredujete prazno okolje, lahko odstranite iskalne poti do izvršljivih datotek in nepovezano konfiguracijo aplikacije.
Za nadaljnje operacije v samem procesu Python namerno spremenite os.environ. To vpliva na to, kaj podedujejo novoustvarjeni podrejeni procesi; ne prepiše okolje nadrejenega terminala in ne prekonfigurira nujno odjemalcev HTTP, ki so svoje nastavitve že zajeli.
API subprocess dokumentira argument env, os.environ pa opisuje procesno okolje Pythona. Prav ta obsega sta razlog, da lahko lupinski ukaz sporoči uspeh, medtem ko naslednja zahteva še vedno uporablja stari proxy.
Nazadnje preverite odjemalca, ki ga dejansko izvajate. Spremenljivke okolja so le en vhod konfiguracije. izrecna možnost proxy ali lastna konfiguracija aplikacije lahko še naprej izbira proxy, potem ko teh spremenljivk ni več.