چرا os.system("unset http_proxy") هیچ چیز را تغییر نمیدهد
متغیر پراکسی را از فرایند درست پایتون حذف کنید یا به یک فرمان فرزند محیطی کنترلشده بدهید.
فراخوانیهای زیر دو فرایند پوسته جداگانه ایجاد میکنند:
os.system('unset http_proxy')
os.system('curl https://example.com/')
پوسته اول متغیری را از محیط خود حذف میکند و خارج میشود. فرایند پایتون هنوز مقدار اصلی را دارد. پوسته دوم دوباره آن را به ارث میبرد.
به فرزند همان محیطی را بدهید که در نظر داشتید
وقتی فقط یک فرمان باید بدون متغیرهای پراکسی بهارثرسیده اجرا شود، محیط پایتون را کپی کنید و کپی را به فرزند بدهید:
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 نیز انتخاب پراکسی را از پیکربندی خود curl بازنویسی میکند. کپی محیط دیگر مقادیری را که فرمان ممکن است نیاز داشته باشد حفظ میکند. در عوض، دادن محیط خالی میتواند مسیرهای جستجوی فایلهای اجرایی و پیکربندی نامرتبط برنامه را حذف کند.
برای عملیات بعدی در خود فرایند پایتون، os.environ را آگاهانه تغییر دهید. این بر آنچه فرزندان تازهساخته به ارث میبرند اثر میگذارد؛ محیط ترمینال والد را بازنویسی نمیکند و لزوماً کلاینتهای HTTP را که تنظیمات خود را قبلاً گرفتهاند دوباره پیکربندی نمیکند.
API زیرفرایند آرگومان env را مستند میکند، و os.environ محیط فرایند پایتون را توصیف میکند. همین دامنهها دلیل آناند که یک فرمان پوسته میتواند موفقیت گزارش کند در حالی که درخواست بعدی هنوز از پراکسی قدیمی استفاده میکند.
در پایان، کلاینتی را که واقعاً اجرا میکنید بررسی کنید. متغیرهای محیطی یک ورودی پیکربندی هستند. یک گزینه صریح پراکسی یا پیکربندی خود یک برنامه میتواند پس از ناپدید شدن آن متغیرها همچنان پراکسی انتخاب کند.