os.system("unset http_proxy") neden hiçbir şeyi değiştirmez
Proxy değişkenini doğru Python sürecinden kaldırın veya alt komuta kontrollü bir ortam sağlayın.
Aşağıdaki çağrılar iki ayrı shell süreci oluşturur:
os.system('unset http_proxy')
os.system('curl https://example.com/')
İlk shell değişkeni kendi ortamından kaldırır ve çıkar. Python sürecinde hâlâ özgün değer vardır. İkinci shell onu yeniden devralır.
Alt sürece amaçladığınız ortamı verin
Devralınan proxy değişkenleri olmadan yalnızca bir komut çalışacaksa, Python'un ortamını kopyalayın ve kopyayı alt sürece geçirin:
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çık boş proxy ayarı, curl'ün kendi yapılandırmasından gelen proxy seçimini de geçersiz kılar. Ortam kopyası, komutun ihtiyaç duyabileceği diğer değerleri korur. Bunun yerine boş bir ortam geçirmek, çalıştırılabilir arama yollarını ve ilgisiz uygulama yapılandırmasını kaldırabilir.
Python sürecinin kendi içindeki sonraki işlemler için os.environ değerini bilinçli olarak değiştirin. Bu, yeni oluşturulan alt süreçlerin neyi devralacağını etkiler; üst terminalin ortamı öğesini yeniden yazmaz ve ayarlarını zaten yakalamış HTTP istemcilerini mutlaka yeniden yapılandırmaz.
subprocess API'si, env bağımsız değişkenini belgeler ve os.environ Python'un süreç ortamını tanımlar. Bir shell komutunun başarı bildirebilmesinin, sonraki isteğin ise hâlâ eski proxy'yi kullanmasının nedeni bu kapsamlardır.
Son olarak, gerçekte çalıştırdığınız istemciyi kontrol edin. Ortam değişkenleri tek bir yapılandırma girdisidir. açık proxy seçeneği veya uygulamanın kendi yapılandırması, bu değişkenler gittikten sonra da proxy seçmeye devam edebilir.