De volgende aanroepen maken twee afzonderlijke shellprocessen:

os.system('unset http_proxy')
os.system('curl https://example.com/')

De eerste shell verwijdert een variabele uit zijn eigen omgeving en stopt. Het Python-proces heeft nog steeds de oorspronkelijke waarde. De tweede shell erft die opnieuw.

Geef het kind de omgeving die je bedoelde

Als slechts één commando zonder geërfde proxyvariabelen moet draaien, kopieer dan de omgeving van Python en geef de kopie aan het kind:

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)

De expliciete lege curl-proxyinstelling overrulet ook de proxykeuze uit curls eigen configuratie. De omgevingskopie behoudt andere waarden die het commando nodig kan hebben. In plaats daarvan een lege omgeving doorgeven kan zoekpaden voor uitvoerbare bestanden en niet-gerelateerde applicatieconfiguratie verwijderen.

Voor latere bewerkingen in het Python-proces zelf wijzig je os.environ bewust. Dat beïnvloedt wat nieuw aangemaakte kinderen erven; het herschrijft niet de omgeving van de bovenliggende terminal en herconfigureert niet noodzakelijk HTTP-clients die hun instellingen al hebben vastgelegd.

De subprocess API documenteert het env-argument, en os.environ beschrijft de procesomgeving van Python. Deze verschillende bereiken zijn de reden dat een shellcommando succes kan melden terwijl het volgende verzoek nog steeds de oude proxy gebruikt.

Controleer ten slotte de client die je daadwerkelijk draait. Omgevingsvariabelen zijn één configuratie-invoer. Een expliciete proxyoptie of de eigen configuratie van een applicatie kan een proxy blijven kiezen nadat die variabelen weg zijn.

Gerelateerde artikelen