Quyidagi chaqiruvlar ikkita alohida shell jarayonini yaratadi:

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

Birinchi shell o'zgaruvchini o'z muhitidan olib tashlab chiqadi. Python jarayonida hali ham asl qiymat bor. Ikkinchi shell uni yana meros oladi.

Bolaga o'zingiz nazarda tutgan muhitni bering

Meros olingan proksi o'zgaruvchilarisiz faqat bitta buyruq ishlashi kerak bo'lsa, Python muhitini nusxalang va nusxani bolaga uzating:

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)

curlning aniq bo'sh proksi sozlamasi curlning o'z konfiguratsiyasidan proksi tanlashni ham bekor qiladi. Muhit nusxasi buyruqqa kerak bo'lishi mumkin bo'lgan boshqa qiymatlarni saqlaydi. Buning o'rniga bo'sh muhit uzatish bajariladigan fayllarni qidirish yo'llari va aloqasiz ilova konfiguratsiyasini olib tashlashi mumkin.

Python jarayonining o'zidagi keyingi amallar uchun os.environ ni ataylab o'zgartiring. Bu yangi yaratilgan bolalar nima meros olishiga ta'sir qiladi; u ota terminal muhiti ni qayta yozmaydi va sozlamalarini allaqachon qabul qilgan HTTP mijozlarini albatta qayta sozlamaydi.

subprocess API env argumentini hujjatlashtiradi, os.environ esa Python jarayon muhitini tavsiflaydi. Aynan shu doiralar shell buyrug'i muvaffaqiyat haqida xabar berishi, keyingi so'rov esa hali ham eski proksidan foydalanishiga sabab bo'ladi.

Nihoyat, siz haqiqatda ishga tushirayotgan mijozni tekshiring. Muhit o'zgaruvchilari konfiguratsiyaning faqat bitta kirishidir. aniq proksi varianti yoki ilovaning o'z konfiguratsiyasi bu o'zgaruvchilar yo'qolgandan keyin ham proksi tanlashni davom ettirishi mumkin.

O'xshash maqolalar