Proč os.system("unset http_proxy") nic nezmění
Odstraňte proměnnou proxy ze správného procesu Python nebo předejte podřízenému příkazu řízené prostředí.
Následující volání vytvářejí dva samostatné procesy shellu:
os.system('unset http_proxy')
os.system('curl https://example.com/')
První shell odstraní proměnnou z vlastního prostředí a skončí. Proces Python má stále původní hodnotu. Druhý shell ji znovu zdědí.
Dejte podřízenému procesu prostředí, které jste zamýšleli
Když má bez zděděných proxy proměnných běžet jen jeden příkaz, zkopírujte prostředí Pythonu a kopii předejte podřízené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ázdné nastavení proxy v curl také přebíjí volbu proxy z vlastní konfigurace curl. Kopie prostředí zachovává další hodnoty, které příkaz může potřebovat. Předání prázdného prostředí místo toho může odstranit cesty pro hledání spustitelných souborů a nesouvisející konfiguraci aplikací.
Pro další operace v samotném procesu Python změňte os.environ záměrně. Ovlivní to, co nově vytvořené podřízené procesy zdědí; nepřepíše prostředí nadřazeného terminálu ani nutně nepřenastaví HTTP klienty, kteří už své nastavení zachytili.
API subprocess dokumentuje argument env a os.environ popisuje procesní prostředí Pythonu. Právě kvůli těmto rozsahům může příkaz shellu hlásit úspěch, zatímco následující požadavek stále používá starou proxy.
Nakonec zkontrolujte klienta, který skutečně spouštíte. Proměnné prostředí jsou jeden vstup konfigurace. Explicitní volba proxy nebo vlastní konfigurace aplikace může nadále volit proxy i poté, co tyto proměnné zmizí.