Наведені нижче виклики створюють два окремі 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, які вже зафіксували свої налаштування.

API subprocess документує аргумент env, а os.environ описує середовище процесу Python. Саме ці межі є причиною того, що shell-команда може повідомити про успіх, тоді як наступний запит досі використовує старий проксі.

Нарешті, перевірте клієнт, який ви насправді запускаєте. Змінні середовища — це лише один вхід конфігурації. явний параметр проксі або власна конфігурація застосунку можуть і далі вибирати проксі після того, як цих змінних не стало.

Схожі статті