ทำไม 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 ขอบเขตเหล่านี้เองคือเหตุผลที่คำสั่งเชลล์อาจรายงานความสำเร็จได้ในขณะที่คำขอถัดไปยังใช้พร็อกซีเดิม
สุดท้าย ตรวจสอบไคลเอนต์ที่คุณกำลังรันจริง ตัวแปรสภาพแวดล้อมเป็นเพียงอินพุตคอนฟิกูเรชันหนึ่งอย่าง ตัวเลือกพร็อกซีที่ชัดเจน หรือคอนฟิกูเรชันของแอปพลิเคชันเองอาจเลือกพร็อกซีต่อไปได้หลังจากตัวแปรเหล่านั้นหายไป