2012-06-08 19 views
29

मेरे पास एक छोटा पायथन एप्लिकेशन है, जिसे subprocess.Popen के माध्यम से लॉन्च किया गया है, जो पर्यावरण चर के रूप में कुछ पैरामीटर लेता है। मैं पर्यावरण संरचना को Popen कॉल में पास करके ऐसा करता हूं। कार्यक्रम os.getenv के माध्यम से चर को पढ़ता है।os.environ ['foo'] कब os.getenv ('foo') से मेल नहीं खाता होगा?

या इसके बजाय, यह उन्हें इस तरह से पढ़ता था। विंडोज़ पर, यह ठीक काम किया। लेकिन हमारे FreeBSD सर्वर, os.getenv रिटर्न सभी मापदंडों हम में पारित के लिए None। पर अजीब बात यह है कि os.environ, मूल्यों ठीक — और है वास्तव में, बस सिर्फ दोनों प्लेटफार्मों पर ठीक os.environ['foo'] बनाया सब कुछ काम करने के लिए सभी os.getenv('foo') कॉल स्विचिंग है ।

ये मान अलग क्यों हैं? एक दूसरे पर कब उपयुक्त है?

उत्तर

17

os.environos मॉड्यूल के आयात पर बनाया गया है, और पर्यावरण में किए गए परिवर्तनों को प्रतिबिंबित नहीं करता है जो बाद में संशोधित किए जाते हैं। दिलचस्प बात यह है कि, os.getenv() वास्तव में सबसे हाल ही में पर्यावरण चर नहीं मिलता है, कम से कम सीपीथन में नहीं। आप देखते हैं, सीपीथॉन में, os.getenv() स्पष्ट रूप से os.environ.get() के आसपास एक रैपर है (http://hg.python.org/cpython/file/6671c5039e15/Lib/os.py#l646 देखें)। इसलिए ऐसा लगता है कि os.getenv() का उपयोग करने का मुख्य कारण यह है कि जब आप os.environ में os.environ की कुंजी के बजाय किसी पर्यावरण चर नाम को नहीं मिला है, या जो कुछ भी फेंक दिया गया है, तो आप एक डिफ़ॉल्ट मान वापस लौटना चाहते हैं, और आप जो भी फेंकना चाहते हैं, कुछ पात्रों को बचाओ।

यह पूरी तरह से संभव है कि फ्रीबीएसडी पर कार्यान्वयन में कुछ अजीब चीज है जो इसे अलग-अलग कार्य करने का कारण बनती है, लेकिन मुझे यकीन नहीं है कि ऐसा क्यों होगा। यदि आप कर सकते हैं तो फ्रीबीएसडी मशीनों में से एक पर os.py की प्रतिलिपि देखें।

+0

विंडोज 10 पर, 'os.putenv (' abc ',' 123 ')' काम नहीं किया, यानी, नया चर सेट नहीं है। हालांकि, 'os.environ [' abc '] =' 123'' काम करता है और बाद में 'os.getenv (' abc ')' काम करता है। –

+1

@arvindpdmn एक और परीक्षा के बाद, ऐसा इसलिए है क्योंकि 'putenv()' वास्तव में पर्यावरण चर को 'os.en वातावरण' में संग्रहीत नहीं करता है; बल्कि, 'पर्यावरण .__ setitem __() 'कॉल' putenv()' और स्थानीय रूप से डेटा स्टोर करता है, और न तो 'getenv()' और न ही वातावरण '। get getemem __()' वास्तव में पर्यावरण को स्वयं पूछताछ करता है, वे जो कुछ भी ओएस से काम करते हैं । वातावरण 'संग्रहित किया गया है। इसे लागू करने के लिए काफी भ्रमित तरीका है। – JAB

संबंधित मुद्दे