os.system("unset http_proxy") ले केही पनि नबदल्ने किन
प्रोक्सी भेरिएबललाई सही Python प्रक्रियाबाट हटाउनुहोस् वा चाइल्ड आदेशलाई नियन्त्रित वातावरण दिनुहोस्।
तलका कलहरूले दुई अलग shell प्रक्रिया बनाउँछन्:
os.system('unset http_proxy')
os.system('curl https://example.com/')
पहिलो shell ले आफ्नै वातावरणबाट भेरिएबल हटाएर बन्द हुन्छ। Python प्रक्रियामा मूल मान अझै रहन्छ। दोस्रो shell ले त्यसलाई फेरि वंशानुगत रूपमा पाउँछ।
बच्चालाई तपाईंले चाहेको वातावरण दिनुहोस्
जब एउटा मात्र आदेश वंशानुगत प्रोक्सी भेरिएबलबिना चल्नुपर्छ, 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 को आफ्नै कन्फिगरेसनबाट हुने प्रोक्सी छनोटलाई पनि अगाडि बढाउँछ। वातावरणको प्रतिलिपिले आदेशलाई आवश्यक पर्न सक्ने अन्य मानहरू जोगाउँछ। यसको सट्टा खाली वातावरण दिँदा executable खोज मार्गहरू र असम्बन्धित अनुप्रयोग कन्फिगरेसन हट्न सक्छ।
Python प्रक्रिया भित्रका पछिल्ला कार्यहरूका लागि, os.environ जानाजानी परिवर्तन गर्नुहोस्। यसले नयाँ सिर्जना गरिएका बच्चाहरूले के वंशानुगत पाउँछन् भन्नेमा असर गर्छ; यसले अभिभावक टर्मिनलको वातावरण पुनः लेख्दैन र आफ्ना सेटिङहरू पहिले नै लिइसकेका HTTP क्लाइन्टहरूलाई अनिवार्य रूपमा पुनः कन्फिगर गर्दैन।
subprocess API ले env आर्गुमेन्टको दस्तावेजीकरण गर्छ, र os.environ ले Python को प्रक्रिया वातावरण वर्णन गर्छ। यी दायराहरूकै कारण shell आदेशले सफलता रिपोर्ट गर्न सक्छ जबकि अर्को अनुरोधले अझै पुरानो प्रोक्सी प्रयोग गरिरहेको हुन्छ।
अन्तमा, तपाईंले वास्तवमै चलाइरहेको क्लाइन्ट जाँच्नुहोस्। वातावरण भेरिएबलहरू कन्फिगरेसनको एउटा मात्र इनपुट हुन्। स्पष्ट प्रोक्सी विकल्प वा अनुप्रयोगको आफ्नै कन्फिगरेसनले ती भेरिएबलहरू गएपछि पनि प्रोक्सी छान्न जारी राख्न सक्छ।