تُنشئ الاستدعاءات التالية عمليتي shell منفصلتين:

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 الذين التقطوا إعداداتهم مسبقًا.

يوثّق واجهة subprocess الوسيط env، ويصف os.environ بيئة عملية Python. هذه النطاقات هي سبب أن أمر shell قد يبلّغ عن النجاح بينما لا يزال الطلب التالي يستخدم البروكسي القديم.

أخيرًا، افحص العميل الذي تشغّله فعلًا. متغيرات البيئة مدخل تكوين واحد. وقد يستمر خيار بروكسي صريح أو إعداد التطبيق نفسه في اختيار بروكسي بعد زوال تلك المتغيرات.

مقالات ذات صلة