Nasledujúce volania vytvárajú dva samostatné shellové procesy:

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

Prvý shell odstráni premennú zo svojho vlastného prostredia a skončí. Proces Python má stále pôvodnú hodnotu. Druhý shell ju zdedí znova.

Dajte podriadenému procesu prostredie, ktoré ste zamýšľali

Ak má bez zdedených premenných proxy bežať iba jeden príkaz, skopírujte prostredie Pythonu a kópiu odovzdajte podriadenému 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)

Explicitné prázdne nastavenie proxy v curl tiež prepisuje výber proxy z vlastnej konfigurácie curl. Kópia prostredia zachováva ďalšie hodnoty, ktoré príkaz môže potrebovať. Odovzdanie prázdneho prostredia namiesto toho môže odstrániť cesty na hľadanie spustiteľných súborov a nesúvisiacu konfiguráciu aplikácie.

Pre ďalšie operácie v samotnom procese Python zámerne zmeňte os.environ. To ovplyvňuje, čo zdedí novovytvorené podriadené procesy; neprepisuje prostredie nadradeného terminálu ani nevyhnutne nenastavuje znova klientov HTTP, ktorí už zachytili svoje nastavenia.

API subprocess dokumentuje argument env a os.environ opisuje procesové prostredie Pythonu. Práve tieto rozsahy spôsobujú, že shellový príkaz môže hlásiť úspech, kým nasledujúca požiadavka stále používa starú proxy.

Napokon skontrolujte klienta, ktorého skutočne spúšťate. Premenné prostredia sú iba jeden vstup konfigurácie. explicitná voľba proxy alebo vlastná konfigurácia aplikácie môže naďalej vyberať proxy aj po tom, čo tieto premenné zmiznú.

Súvisiace články