पायथन (os.environ) में पर्यावरण चर प्राप्त करना, जोड़ना, अधिलेखित करना और हटाना

व्यापार

पर्यावरण चर को os.environ का उपयोग करके पायथन कार्यक्रमों में पुनर्प्राप्त, जाँच, सेट (जोड़ा या अधिलेखित) किया जा सकता है और हटाया जा सकता है। ध्यान दें कि पर्यावरण चर को सेट या हटाकर किए गए परिवर्तन केवल पायथन प्रोग्राम के भीतर ही प्रभावी होते हैं। इसका मतलब यह नहीं है कि सिस्टम पर्यावरण चर को फिर से लिखा जाएगा।

निम्नलिखित जानकारी यहाँ प्रदान की गई है।

  • os.environ
  • पर्यावरण चर प्राप्त करें।
  • पर्यावरण चर सेट करें (जोड़ें/अधिलेखित करें)
  • पर्यावरण चर हटाएं
  • पर्यावरण चर बदलने का प्रभाव
  • पर्यावरण चर द्वारा प्रक्रियाओं को बदलना

ओएस मॉड्यूल को आयात और उपयोग करें। चूंकि यह एक मानक पुस्तकालय है, इसलिए किसी अतिरिक्त स्थापना की आवश्यकता नहीं है। सबप्रोसेस मॉड्यूल को मानक पुस्तकालय में भी शामिल किया गया है।

import os
import subprocess

ओएस.पर्यावरण

os.environ का प्रकार os._Environ है।

print(type(os.environ))
# <class 'os._Environ'>

os._Environ एक मानचित्र प्रकार की वस्तु है जिसमें कुंजी और मान की एक जोड़ी होती है, और इसमें शब्दकोश (तानाशाही प्रकार) के समान तरीके होते हैं। पर्यावरण चर नाम कुंजी है, और इसका मान मान है।

os मॉड्यूल आयात होने पर os.environ की सामग्री लोड हो जाएगी। os.environ की सामग्री को अपडेट नहीं किया जाएगा, भले ही प्रोग्राम के चलने के दौरान सिस्टम पर्यावरण चर को अन्य माध्यमों से बदल दिया गया हो।

सूची प्रिंट () के साथ प्रदर्शित होती है।

# print(os.environ)

शब्दकोश के साथ के रूप में, आप निम्न विधियों का उपयोग कर सकते हैं, या कुंजियों और मूल्यों के अस्तित्व की जांच करने के लिए उपयोग कर सकते हैं।

  • keys()
  • values()

चाबियों और मूल्यों का प्रसंस्करण मूल रूप से शब्दकोशों के समान ही होता है। उदाहरण नीचे दिए गए हैं।

पर्यावरण चर प्राप्त करें।

os.environ[Environment variable name]
यह आपको पर्यावरण चर का मान प्राप्त करने की अनुमति देगा, लेकिन यदि आप एक पर्यावरण चर नाम निर्दिष्ट करते हैं जो मौजूद नहीं है, तो आपको एक त्रुटि (KeyError) मिलेगी।

print(os.environ['LANG'])
# ja_JP.UTF-8

# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'

os.environ की get() विधि का उपयोग डिफ़ॉल्ट मान प्राप्त करने के लिए किया जा सकता है यदि यह मौजूद नहीं है। यह भी शब्दकोश के समान ही है।

print(os.environ.get('LANG'))
# ja_JP.UTF-8

print(os.environ.get('NEW_KEY'))
# None

print(os.environ.get('NEW_KEY', 'default'))
# default

फ़ंक्शन os.getenv() भी प्रदान किया गया है। शब्दकोश की प्राप्त () विधि की तरह, यदि कुंजी मौजूद नहीं है, तो यह डिफ़ॉल्ट मान लौटाता है। यह फ़ंक्शन उपयोगी है यदि आप केवल एक पर्यावरण चर के मूल्य को प्राप्त करना और जांचना चाहते हैं।

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(os.getenv('NEW_KEY'))
# None

print(os.getenv('NEW_KEY', 'default'))
# default

पर्यावरण चर सेट करें (जोड़ें/अधिलेखित करें)

os.environ[Environment variable name]
इसके लिए एक मान निर्दिष्ट करके, आप एक पर्यावरण चर सेट कर सकते हैं।

जब एक नया पर्यावरण चर नाम निर्दिष्ट किया जाता है, तो पर्यावरण चर नया जोड़ा जाता है, और जब एक मौजूदा पर्यावरण चर नाम निर्दिष्ट किया जाता है, तो पर्यावरण चर का मान अधिलेखित हो जाता है।

os.environ['NEW_KEY'] = 'test'

print(os.environ['NEW_KEY'])
# test

os.environ['NEW_KEY'] = 'test2'

print(os.environ['NEW_KEY'])
# test2

ध्यान दें कि एक स्ट्रिंग के अलावा कुछ भी निर्दिष्ट करने के परिणामस्वरूप एक त्रुटि (TypeError) होगी। यदि आप एक संख्यात्मक मान निर्दिष्ट करना चाहते हैं, तो इसे एक स्ट्रिंग के रूप में निर्दिष्ट करें।

# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int

os.environ['NEW_KEY'] = '100'

फ़ंक्शन os.putenv() भी प्रदान किया गया है। हालांकि, जब os.putenv() द्वारा सेट किया जाता है तो os.environ का मान अपडेट नहीं होता है। इस कारण से, os.environ की कुंजी (पर्यावरण चर नाम) निर्दिष्ट करना और ऊपर के उदाहरण में दिखाए गए मान को असाइन करना बेहतर है।

यदि putenv() समर्थित है, os.environ में किसी आइटम के लिए एक असाइनमेंट स्वचालित रूप से putenv() के लिए संबंधित कॉल में परिवर्तित हो जाएगा। व्यवहार में, os.environ में किसी आइटम को असाइन करना पसंदीदा ऑपरेशन है, क्योंकि putenv() को सीधे कॉल करने से os.environ अपडेट नहीं होगा।
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

जैसा कि पहले उल्लेख किया गया है, पर्यावरण चर जोड़ने या अधिलेखित करके किए गए परिवर्तन केवल पायथन प्रोग्राम के भीतर ही प्रभावी होते हैं। इसका मतलब यह नहीं है कि सिस्टम पर्यावरण चर को फिर से लिखा जाएगा।

ध्यान दें कि मान बदलने से OS के आधार पर मेमोरी लीक हो सकती है।

नोट: फ्रीबीएसडी और मैक ओएस एक्स सहित कुछ प्लेटफार्मों पर, पर्यावरण के मूल्य को बदलने से स्मृति रिसाव हो सकता है।
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

यह OS के ही putenv() विनिर्देशन के कारण है।

Successive calls to setenv() or putenv() assigning a differently sized value to the same name will result in a memory leak. The FreeBSD seman-tics semantics for these functions (namely, that the contents of value are copied and that old values remain accessible indefinitely) make this bug unavoidable.
Mac OS X Manual Page For putenv(3)

पर्यावरण चर हटाएं

पर्यावरण चर को हटाने के लिए, os.environ या डेल स्टेटमेंट की पॉप () विधि का उपयोग करें। शब्दकोश के समान।

निम्नलिखित पॉप () का एक उदाहरण है।

पॉप () हटाए गए पर्यावरण चर का मान लौटाता है। डिफ़ॉल्ट रूप से, एक पर्यावरण चर निर्दिष्ट करना जो मौजूद नहीं है, एक त्रुटि (KeyError) में परिणाम देगा, लेकिन दूसरा तर्क निर्दिष्ट करने से पर्यावरण चर का मान वापस आ जाएगा यदि यह मौजूद नहीं है।

print(os.environ.pop('NEW_KEY'))
# 100

# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'

print(os.environ.pop('NEW_KEY', None))
# None

निम्नलिखित डेल का एक उदाहरण है।

पर्यावरण चर को फिर से जोड़ा जाता है, और फिर हटा दिया जाता है। यदि पर्यावरण चर मौजूद नहीं है, तो एक त्रुटि (KeyError)।

os.environ['NEW_KEY'] = '100'

print(os.getenv('NEW_KEY'))
# 100

del os.environ['NEW_KEY']

print(os.getenv('NEW_KEY'))
# None

# del os.environ['NEW_KEY']
# KeyError: 'NEW_KEY'

फ़ंक्शन os.unsetenv() भी प्रदान किया गया है। हालाँकि, जैसा कि os.putenv() के साथ होता है, os.unsetenv() द्वारा हटाए जाने पर os.environ का मान अपडेट नहीं होता है। इसलिए, os.environ की कुंजी (पर्यावरण चर नाम) निर्दिष्ट करना और इसे ऊपर के उदाहरण में दिखाए अनुसार हटाना बेहतर है।

यदि unsetenv () समर्थित है, तो os.environ में किसी आइटम को हटाने से संबंधित कॉल को unsetenv () में स्वचालित रूप से अनुवादित किया जाएगा। व्यवहार में, os.environ में आइटम हटाना पसंदीदा ऑपरेशन है, क्योंकि unsetenv() पर सीधे कॉल os.environ को अपडेट नहीं करेंगे।
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

पर्यावरण चर को हटाना भी केवल उस पायथन कार्यक्रम के भीतर ही प्रभावी है। यह सिस्टम पर्यावरण चर को नहीं हटाता है।

पर्यावरण चर बदलने का प्रभाव

जैसा कि मैंने बार-बार लिखा है, os.environ पर्यावरण चर को बदलना (सेट करना या हटाना) सिस्टम पर्यावरण चर को नहीं बदलता है, लेकिन यह प्रोग्राम में लॉन्च होने वाली उप-प्रक्रियाओं को प्रभावित करता है।

निम्न कोड विंडोज़ पर अपेक्षित रूप से काम नहीं करेगा क्योंकि कोई LANG पर्यावरण चर नहीं है और दिनांक कमांड की सामग्री अलग है।

सबप्रोसेस मॉड्यूल में दिनांक कमांड को कॉल करना।

LANG पर्यावरण चर के मान के आधार पर date कमांड का आउटपुट परिणाम बदलता है।

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(subprocess.check_output('date', encoding='utf-8'))
# 2018年 7月12日 木曜日 20時54分13秒 JST
# 

os.environ['LANG'] = 'en_US'

print(subprocess.check_output('date', encoding='utf-8'))
# Thu Jul 12 20:54:13 JST 2018
# 

स्पष्टीकरण के लिए, हमने os.environ में LANG पर्यावरण चर को बदल दिया है, लेकिन पायथन लोकेल को नियंत्रित करने के लिए एक लोकेल मॉड्यूल प्रदान करता है।

पर्यावरण चर द्वारा प्रक्रियाओं को बदलना

पर्यावरण चर के मान के अनुसार प्रक्रिया को स्विच करना भी संभव है।

भाषा सेटिंग्स में LANG पर्यावरण चर के अनुसार आउटपुट बदलने का एक उदाहरण यहां दिया गया है। यहां हम यह निर्धारित करने के लिए startwith() विधि का उपयोग कर रहे हैं कि क्या स्ट्रिंग निर्दिष्ट स्ट्रिंग से शुरू होती है, लेकिन यदि आप सटीक मिलान निर्धारित करना चाहते हैं, तो आप तुलना करने के लिए “==” का उपयोग कर सकते हैं।

print(os.getenv('LANG'))
# en_US

if os.getenv('LANG').startswith('ja'):
    print('こんにちは')
else:
    print('Hello')
# Hello

os.environ['LANG'] = 'ja_JP'

if os.getenv('LANG').startswith('ja'):
    print('こんにちは')
else:
    print('Hello')
# こんにちは

इसके अलावा, यदि पर्यावरण चर विकास पर्यावरण और उत्पादन पर्यावरण को इंगित करने के लिए सेट हैं, उदाहरण के लिए, आप इन चरों के मान प्राप्त कर सकते हैं और प्रक्रिया को स्विच कर सकते हैं।