מדוע os.system("unset http_proxy") לא משנה דבר
הסירו משתנה פרוקסי מהתהליך הנכון של Python או ספקו סביבה מבוקרת לפקודת בת.
הקריאות הבאות יוצרות שני תהליכי מעטפת נפרדים:
os.system('unset http_proxy')
os.system('curl https://example.com/')
המעטפת הראשונה מסירה משתנה מהסביבה של עצמה ויוצאת. לתהליך Python עדיין יש הערך המקורי. המעטפת השנייה יורשת אותו שוב.
תנו לילד את הסביבה שהתכוונתם אליה
כאשר רק פקודה אחת צריכה לרוץ בלי משתני פרוקסי בירושה, העתיקו את הסביבה של Python והעבירו את ההעתק לילד:
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 עצמו. העתקת הסביבה משמרת ערכים אחרים שהפקודה עשויה להזדקק להם. העברת סביבה ריקה במקום עשויה להסיר נתיבי חיפוש של קבצים ניתנים להרצה ותצורת יישום לא קשורה.
עבור פעולות מאוחרות יותר בתהליך Python עצמו, שנו את os.environ במכוון. זה משפיע על מה שילדים חדשים שנוצרו יורשים; זה לא כותב מחדש את הסביבה של הטרמינל האב ולא בהכרח מגדיר מחדש לקוחות HTTP שכבר לכדו את ההגדרות שלהם.
ה-API של subprocess מתעד את הארגומנט env, ו-os.environ מתאר את סביבת התהליך של Python. התחומים האלה הם הסיבה לכך שפקודת מעטפת יכולה לדווח על הצלחה בזמן שהבקשה הבאה עדיין משתמשת בפרוקסי הישן.
לבסוף, בדקו את הלקוח שאתם באמת מריצים. משתני סביבה הם קלט תצורה אחד. אפשרות פרוקסי מפורשת או התצורה של היישום עצמו יכולות להמשיך לבחור פרוקסי אחרי שהמשתנים האלה נעלמו.