Защо os.system("unset http_proxy") не променя нищо
Премахнете променливата за прокси от правилния процес на Python или подайте контролирана среда на дъщерна команда.
Следните извиквания създават два отделни shell процеса:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Първият shell премахва променлива от собствената си среда и приключва. Процесът на Python все още пази първоначалната стойност. Вторият shell я наследява отново.
Дайте на дъщерния процес средата, която имате предвид
Когато само една команда трябва да работи без наследени прокси променливи, копирайте средата на Python и подайте копието на дъщерния процес:
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)
Явната празна настройка за прокси на curl също отменя избора на прокси от собствената конфигурация на curl. Копието на средата запазва други стойности, от които командата може да се нуждае. Подаването на празна среда вместо това може да премахне пътищата за търсене на изпълними файлове и несвързана конфигурация на приложения.
За следващи операции в самия процес на Python променете os.environ умишлено. Това влияе върху това какво наследяват новосъздадените дъщерни процеси; не пренаписва средата на родителския терминал и не преконфигурира непременно HTTP клиенти, които вече са записали настройките си.
subprocess API документира аргумента env, а os.environ описва средата на процеса на Python. Тези обхвати са причината една shell команда да съобщи за успех, докато следващата заявка все още използва стария прокси.
Накрая проверете клиента, който всъщност изпълнявате. Променливите на средата са един вход за конфигурация. Явна опция за прокси или собствената конфигурация на приложението може да продължи да избира прокси, след като тези променливи изчезнат.