Niyə os.system("unset http_proxy") heç nəyi dəyişmir
Proxy dəyişənini düzgün Python prosesindən çıxarın və ya alt əmri nəzarətli mühitlə təmin edin.
Aşağıdakı çağırışlar iki ayrı shell prosesi yaradır:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Birinci shell dəyişəni öz mühitindən çıxarıb sonlanır. Python prosesində orijinal dəyər hələ də qalır. İkinci shell onu yenidən miras alır.
Alt prosesə nəzərdə tutduğunuz mühiti verin
Yalnız bir əmrin miras alınmış proxy dəyişənləri olmadan işləməsi lazımdırsa, Python-un mühitini kopyalayın və kopyanı alt prosesə ötürün:
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-ün açıq boş proxy parametri həm də curl-ün öz konfiqurasiyasından gələn proxy seçimini üstələyir. Mühit kopyası əmrin ehtiyac duya biləcəyi digər dəyərləri qoruyur. Əvəzində boş mühit ötürmək icra olunan fayl axtarış yollarını və əlaqəsiz tətbiq konfiqurasiyasını silə bilər.
Python prosesinin özündə sonrakı əməliyyatlar üçün os.environ dəyişənini qəsdən dəyişin. Bu, yeni yaradılan alt proseslərin nəyi miras alacağına təsir edir; valideyn terminalının mühitini yenidən yazmır və artıq öz parametrlərini qeyd etmiş HTTP müştərilərini mütləq yenidən konfiqurasiya etmir.
subprocess API-si env arqumentini sənədləşdirir, os.environ isə Python-un proses mühitini təsvir edir. Bu əhatə dairələri bir shell əmrinin uğur bildirməsinin, növbəti sorğunun isə hələ də köhnə proxydən istifadə etməsinin səbəbidir.
Nəhayət, həqiqətən işlətdiyiniz müştəriyə baxın. Mühit dəyişənləri bir konfiqurasiya girişidir. Açıq proxy seçimi və ya tətbiqin öz konfiqurasiyası bu dəyişənlər yox olduqdan sonra da proxy seçməyə davam edə bilər.