Почему os.system("unset http_proxy") ничего не меняет
Удалите переменную прокси из нужного процесса Python или передайте дочерней команде контролируемое окружение.
Следующие вызовы создают два отдельных процесса оболочки:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Первая оболочка удаляет переменную из своего окружения и завершается. В процессе Python по-прежнему исходное значение. Вторая оболочка снова его наследует.
Передайте дочернему процессу то окружение, которое задумали
Когда без унаследованных переменных прокси должна выполниться только одна команда, скопируйте окружение 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. Именно из-за этих разных областей команда оболочки может сообщить об успехе, тогда как следующий запрос всё ещё использует старый прокси.
Наконец, проверьте клиент, который вы действительно запускаете. Переменные окружения — лишь один вход конфигурации. Явный параметр прокси или собственная конфигурация приложения могут продолжать выбирать прокси после того, как эти переменные исчезли.