Warum os.system("unset http_proxy") nichts ändert
Entfernen Sie eine Proxyvariable aus dem richtigen Python-Prozess oder geben Sie einem untergeordneten Befehl eine kontrollierte Umgebung.
Die folgenden Aufrufe erzeugen zwei getrennte Shell-Prozesse:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Die erste Shell entfernt eine Variable aus ihrer eigenen Umgebung und beendet sich. Der Python-Prozess hat noch den ursprünglichen Wert. Die zweite Shell erbt ihn erneut.
Geben Sie dem Kind die Umgebung, die Sie beabsichtigt haben
Wenn nur ein Befehl ohne geerbte Proxyvariablen laufen soll, kopieren Sie Pythons Umgebung und übergeben Sie die Kopie an das 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)
Die explizite leere curl-Proxy-Einstellung überschreibt zudem die Proxyauswahl aus curls eigener Konfiguration. Die Umgebungskopie bewahrt andere Werte, die der Befehl benötigen kann. Eine leere Umgebung stattdessen zu übergeben kann Suchpfade für ausführbare Dateien und unabhängige Anwendungskonfiguration entfernen.
Für nachfolgende Vorgänge im Python-Prozess selbst ändern Sie os.environ bewusst. Das beeinflusst, was neu erzeugte Kindprozesse erben; es schreibt nicht die Umgebung des übergeordneten Terminals um und konfiguriert nicht unbedingt HTTP-Clients neu, die ihre Einstellungen bereits übernommen haben.
Die subprocess-API dokumentiert das Argument env, und os.environ beschreibt Pythons Prozessumgebung. Diese Geltungsbereiche sind der Grund, warum ein Shell-Befehl Erfolg melden kann, während die nächste Anfrage noch den alten Proxy verwendet.
Prüfen Sie schließlich den Client, den Sie tatsächlich ausführen. Umgebungsvariablen sind eine Konfigurationseingabe. Eine explizite Proxy-Option oder die eigene Konfiguration einer Anwendung kann weiterhin einen Proxy wählen, nachdem diese Variablen verschwunden sind.