Следните повици создаваат два одделни shell процеси:

os.system('unset http_proxy')
os.system('curl https://example.com/')

Првиот shell отстранува променлива од сопствената околина и завршува. Python процесот сè уште ја има првобитната вредност. Вториот shell повторно ја наследува.

Дајте му на детето околината што сте ја намерале

Кога само една команда треба да работи без наследени proxy променливи, копирајте ја околината на 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 proxy поставување исто така го поништува изборот на proxy од сопствената конфигурација на curl. Копијата на околината ги зачувува другите вредности што може да и требаат на командата. Предавањето празна околина пак може да ги отстрани патеките за пребарување извршни датотеки и неважната конфигурација на апликацијата.

За понатамошни операции во самиот Python процес, намерно менувајте os.environ. Тоа влијае на она што ќе го наследат новосоздадените деца; не ја препишува околината на родителскиот терминал ниту нужно ги реконфигурира HTTP клиентите што веќе ги фатиле своите поставки.

subprocess API го документира аргументот env, а os.environ ја опишува процесната околина на Python. Овие опфати се причината зошто една shell команда може да пријави успех додека следното барање сè уште го користи стариот proxy.

На крајот, проверете го клиентот што навистина го извршувате. Променливите на околината се само еден влез за конфигурација. Експлицитна proxy опција или сопствената конфигурација на апликацијата може да продолжат да избираат proxy откако тие променливи ќе исчезнат.

Поврзани статии