Следующие вызовы создают два отдельных процесса оболочки:

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. Именно из-за этих разных областей команда оболочки может сообщить об успехе, тогда как следующий запрос всё ещё использует старый прокси.

Наконец, проверьте клиент, который вы действительно запускаете. Переменные окружения — лишь один вход конфигурации. Явный параметр прокси или собственная конфигурация приложения могут продолжать выбирать прокси после того, как эти переменные исчезли.

Похожие статьи