Mengapa os.system("unset http_proxy") tidak mengubah apa pun
Hapus variabel proxy dari proses Python yang tepat atau berikan lingkungan terkendali kepada perintah anak.
Panggilan berikut membuat dua proses shell terpisah:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Shell pertama menghapus variabel dari lingkungannya sendiri lalu keluar. Proses Python masih memiliki nilai aslinya. Shell kedua mewarisinya lagi.
Berikan kepada anak lingkungan yang Anda maksudkan
Ketika hanya satu perintah yang harus berjalan tanpa variabel proxy warisan, salin lingkungan Python dan teruskan salinannya kepada anak:
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)
Pengaturan proxy kosong eksplisit curl juga menimpa pemilihan proxy dari konfigurasi curl itu sendiri. Salinan lingkungan mempertahankan nilai lain yang mungkin dibutuhkan perintah. Meneruskan lingkungan kosong sebagai gantinya dapat menghapus jalur pencarian berkas yang dapat dieksekusi dan konfigurasi aplikasi yang tidak terkait.
Untuk operasi berikutnya dalam proses Python itu sendiri, ubah os.environ dengan sengaja. Itu memengaruhi apa yang diwarisi anak yang baru dibuat; itu tidak menulis ulang lingkungan terminal induk atau dengan sendirinya mengonfigurasi ulang klien HTTP yang sudah menangkap pengaturannya.
API subprocess mendokumentasikan argumen env, dan os.environ menjelaskan lingkungan proses Python. Cakupan inilah alasan perintah shell dapat melaporkan keberhasilan sementara permintaan berikutnya masih memakai proxy lama.
Terakhir, periksa klien yang benar-benar Anda jalankan. Variabel lingkungan adalah satu masukan konfigurasi. Opsi proxy eksplisit atau konfigurasi aplikasi itu sendiri dapat terus memilih proxy setelah variabel tersebut hilang.