Varför os.system("unset http_proxy") inte ändrar något
Ta bort proxyvariabeln från rätt Python-process eller ge det underordnade kommandot en kontrollerad miljö.
Följande anrop skapar två separata shellprocesser:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Det första skalet tar bort en variabel från sin egen miljö och avslutas. Python-processen har fortfarande det ursprungliga värdet. Det andra skalet ärver det igen.
Ge barnet den miljö du avsåg
När bara ett kommando ska köras utan ärvda proxyvariabler, kopiera Pythons miljö och skicka kopian till barnet:
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)
Den uttryckliga tomma proxyinställningen i curl åsidosätter också proxyvalet från curls egen konfiguration. Miljökopian bevarar andra värden som kommandot kan behöva. Att i stället skicka en tom miljö kan ta bort sökvägar för körbara filer och orelaterad programkonfiguration.
För efterföljande operationer i själva Python-processen, ändra os.environ medvetet. Det påverkar vad nyskapade barn ärver; det skriver inte om den överordnade terminalens miljö och konfigurerar inte nödvändigtvis om HTTP-klienter som redan har fångat sina inställningar.
subprocess-API:et dokumenterar argumentet env, och os.environ beskriver Pythons processmiljö. Det är dessa omfång som gör att ett shellkommando kan rapportera framgång medan nästa begäran fortfarande använder den gamla proxyn.
Kontrollera slutligen den klient du faktiskt kör. Miljövariabler är en konfigurationsinmatning. uttrycklig proxyinställning eller programmets egen konfiguration kan fortsätta att välja en proxy efter att dessa variabler är borta.