Ինչու 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 հրամանը կարող է հաջողություն հաղորդել, մինչդեռ հաջորդ հարցումը դեռ օգտագործում է հին պրոքսին։
Վերջում ստուգեք այն հաճախորդը, որն իրականում գործարկում եք։ Միջավայրի փոփոխականները կոնֿիգուրացիայի մեկ մուտք են։ Բացահայտ պրոքսի ընտրանքը կամ հավելվածի սեփական կոնֆիգուրացիան կարող են շարունակել պրոքսի ընտրել այն բանից հետո, երբ այդ փոփոխականները անհետացել են։