Mengapa os.system("unset http_proxy") tidak mengubah apa-apa
Buang pemboleh ubah proksi daripada proses Python yang betul atau berikan persekitaran terkawal kepada arahan anak.
Panggilan berikut mencipta dua proses shell yang berasingan:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Shell pertama membuang pemboleh ubah daripada persekitarannya sendiri dan keluar. Proses Python masih menyimpan nilai asal. Shell kedua mewarisinya semula.
Berikan anak persekitaran yang anda maksudkan
Apabila hanya satu arahan perlu berjalan tanpa pemboleh ubah proksi warisan, salin persekitaran Python dan hantar salinan itu 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)
Tetapan proksi curl kosong yang eksplisit juga mengatasi pemilihan proksi daripada konfigurasi curl sendiri. Salinan persekitaran mengekalkan nilai lain yang mungkin diperlukan oleh arahan. Menghantar persekitaran kosong sebaliknya boleh membuang laluan carian fail boleh laku dan konfigurasi aplikasi yang tidak berkaitan.
Untuk operasi seterusnya dalam proses Python itu sendiri, ubah os.environ secara sengaja. Itu mempengaruhi apa yang diwarisi oleh anak yang baru dicipta; ia tidak menulis semula persekitaran terminal induk atau semestinya mengkonfigurasi semula klien HTTP yang sudah menangkap tetapan mereka.
subprocess API mendokumenkan argumen env, dan os.environ menerangkan persekitaran proses Python. Skop inilah sebabnya arahan shell boleh melaporkan kejayaan sedangkan permintaan seterusnya masih menggunakan proksi lama.
Akhir sekali, semak klien yang anda benar-benar jalankan. Pemboleh ubah persekitaran ialah satu input konfigurasi. Pilihan proksi eksplisit atau konfigurasi aplikasi itu sendiri boleh terus memilih proksi selepas pemboleh ubah itu hilang.