Эмне үчүн 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 командасы ийгилик билдирип, бирок кийинки суроо-талап эски проксини колдонуп жатканынын себеби.
Акыркы кезекте, сиз чындап иштетип жаткан кардарды текшериңиз. Чөйрө өзгөрмөлөрү — конфигурациянын бир гана кирүү булагы. ачык прокси параметри же колдонмонун өз конфигурациясы бул өзгөрмөлөр жок болгондон кийин да проксини тандоону уланта алат.