Poniższe wywołania tworzą dwa osobne procesy powłoki:

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

Pierwsza powłoka usuwa zmienną z własnego środowiska i kończy pracę. Proces Pythona nadal ma pierwotną wartość. Druga powłoka znów ją dziedziczy.

Daj dziecku środowisko, które zamierzałeś

Gdy tylko jedno polecenie ma działać bez odziedziczonych zmiennych proxy, skopiuj środowisko Pythona i przekaż kopię dziecku:

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)

Jawne puste ustawienie proxy w curl łamie też wybór proxy z własnej konfiguracji curla. Kopia środowiska zachowuje inne wartości, których polecenie może potrzebować. Przekazanie zamiast tego pustego środowiska może usunąć ścieżki wyszukiwania plików wykonywalnych i niezwiązaną konfigurację aplikacji.

W przypadku dalszych operacji w samym procesie Pythona świadomie zmieniaj os.environ. Wpływa to na to, co dziedziczą nowo utworzone dzieci; nie przepisuje środowiska terminala nadrzędnego ani nie musi ponownie konfigurować klientów HTTP, które już przechwyciły swoje ustawienia.

subprocess API dokumentuje argument env, a os.environ opisuje środowisko procesu Pythona. Te różne zakresy są powodem, dla którego polecenie powłoki może zgłosić sukces, podczas gdy następne żądanie nadal używa starego proxy.

Na koniec sprawdź klienta, którego faktycznie uruchamiasz. Zmienne środowiskowe to tylko jedno źródło konfiguracji. Jawna opcja proxy lub własna konfiguracja aplikacji może nadal wybierać proxy po zniknięciu tych zmiennych.

Powiązane artykuły