การเรียกต่อไปนี้สร้างเชลล์สองโปรเซสแยกกัน:

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

สุดท้าย ตรวจสอบไคลเอนต์ที่คุณกำลังรันจริง ตัวแปรสภาพแวดล้อมเป็นเพียงอินพุตคอนฟิกูเรชันหนึ่งอย่าง ตัวเลือกพร็อกซีที่ชัดเจน หรือคอนฟิกูเรชันของแอปพลิเคชันเองอาจเลือกพร็อกซีต่อไปได้หลังจากตัวแปรเหล่านั้นหายไป

บทความที่เกี่ยวข้อง