एक पर्यावरण चर मौजूद है या नहीं, यह जांचने के लिए एक अच्छा अभ्यास क्या है?


130

मैं अपने वातावरण को चर के अस्तित्व के लिए जांचना चाहता हूं, कहते हैं "FOO", पायथन में। इस उद्देश्य के लिए, मैं osमानक पुस्तकालय का उपयोग कर रहा हूं । पुस्तकालय के प्रलेखन को पढ़ने के बाद, मैंने अपने लक्ष्य को प्राप्त करने के 2 तरीके निकाले हैं:

विधि 1:

if "FOO" in os.environ:
    pass

विधि 2:

if os.getenv("FOO") is not None:
    pass

मैं जानना चाहूंगा कि कौन सी विधि, यदि या तो, एक अच्छी / पसंदीदा स्थिति है और क्यों।


यह मुख्य रूप से आधारित है। दोनों एक ही उद्देश्य की सेवा करते हैं। मैं विधि 1 को पसंद करूंगा क्योंकि यह क्लीनर है
मोइनुद्दीन क्वाड्री

1
मैं यह नहीं कह सकता कि इसमें कुछ भी है। एक को चुनें (एक सिक्का फ्लिप करें?) और बाद में पुनर्मूल्यांकन करें अगर यह काम नहीं करता है। स्पष्ट रूप से मुझे लगता है कि आपने इस प्रश्न को टाइप करने में अधिक समय बिताया है, जिससे आप किसी तरह बचेंगे!
जोनरशेप

1
@Ayoub: मुझे लगता है कि आप प्रश्न देखना भूल गए हैं "यह जांचने के लिए एक अच्छा अभ्यास है कि क्या एक पर्यावरण चर मौजूद है या नहीं, अजगर में है?"
मोइनुद्दीन क्वाड्री

1
राय आधारित। विधि 1 सिंटैक्स बेहतर कार्य करता है, क्योंकि आप पूछते हैं कि क्या fooenv vars में है, यदि मानों fooमें परिणामों की मांग नहीं है None
ऊरीएल

1
लेकिन यह तरीका स्पष्ट नहीं हो सकता है, जब तक कि आप डच न हों ...
21

जवाबों:


168

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

आप यह देखने की कोशिश कर रहे हैं कि अगर कुछ मौजूद है environ , तो आपको इसकी तुलना करने के लिए क्यों मिलेगा और फिर इसे टॉस करना होगा ?

ठीक यही getenvहै:

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

(इसका मतलब यह भी है कि आपका चेक सिर्फ हो सकता है if getenv("FOO"))

आप इसे प्राप्त नहीं करना चाहते , आप इसके अस्तित्व की जांच करना चाहते हैं।

किसी भी तरह, getenvबस एक आवरण के आसपास है, environ.getलेकिन आप लोगों को मैपिंग में सदस्यता के लिए जाँच करते हुए नहीं देखते हैं:

from os import environ
if environ.get('Foo') is not None:

संक्षेप में, उपयोग करने के लिए:

if "FOO" in os.environ:
    pass

यदि आप सिर्फ अस्तित्व की जांच करना चाहते हैं, जबकि, getenv("FOO")यदि आप वास्तव में उपयोग करना चाहते हैं , तो आप जो मूल्य प्राप्त कर सकते हैं, उसके साथ कुछ करना चाहते हैं।


2
आपके व्याख्या के लिये धन्यवाद। मैं इसे ध्यान में रखूंगा।
क्षितिज सरावगी

29

पर्यावरण चर के अस्तित्व पर सशर्त क्या करना चाहते हैं, इसके आधार पर या तो समाधान के लिए एक मामला है।

मामला एक

जब आप पर्यावरण चर के अस्तित्व के आधार पर अलग-अलग कार्य करना चाहते हैं, तो इसके मूल्य की परवाह किए बिना, पहला उपाय सबसे अच्छा अभ्यास है। यह पूरी तरह से वर्णन करता है कि आप क्या परीक्षण करते हैं: पर्यावरण चर की सूची में 'FOO' है।

if 'KITTEN_ALLERGY' in os.environ:
    buy_puppy()
else:
    buy_kitten()

केस 2

जब आप डिफ़ॉल्ट मान सेट करना चाहते हैं यदि मान पर्यावरण चर में परिभाषित नहीं है तो दूसरा समाधान वास्तव में उपयोगी है, हालांकि आपके द्वारा लिखे गए फॉर्म में नहीं:

server = os.getenv('MY_CAT_STREAMS', 'youtube.com')

या शायद

server = os.environ.get('MY_CAT_STREAMS', 'youtube.com')

ध्यान दें कि यदि आपके पास आपके आवेदन के लिए कई विकल्प हैं, तो आप उस पर गौर करना चाहते हैं ChainMap, जो कुंजी के आधार पर कई डाइक को मर्ज करने की अनुमति देता है। ChainMapप्रलेखन में इसका एक उदाहरण है :

[...]
combined = ChainMap(command_line_args, os.environ, defaults)

15

सुरक्षित पक्ष उपयोग पर होना

os.getenv('FOO') or 'bar'

उपरोक्त उत्तरों के साथ एक कोने का मामला तब है जब पर्यावरण चर सेट किया गया है, लेकिन खाली है

इस विशेष मामले के लिए

print(os.getenv('FOO', 'bar'))
# prints new line - though you expected `bar`

या

if "FOO" in os.environ:
    print("FOO is here")
# prints FOO is here - however its not

इससे बचने के लिए बस इस्तेमाल करें or

os.getenv('FOO') or 'bar'

फिर आप प्राप्त करें

print(os.getenv('FOO') or 'bar')
# bar

हमारे पास खाली पर्यावरण चर कब हैं?

आप .envफ़ाइल में मान सेट करना भूल गए

# .env
FOO=

या के रूप में निर्यात किया

$ export FOO=

या इसे सेट करना भूल गया settings.py

# settings.py
os.environ['FOO'] = ''

अपडेट: यदि संदेह है, तो इन वन-लाइनर्स को देखें

>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))

$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"

गेटेनव के लिए हस्ताक्षर def getenv(key, default=None):ऐसा है, ताकि शुरुआत में एक डिफ़ॉल्ट बनाम सिंटैक्स की अनुमति दी जाए
क्रिस मैककी

@ क्रिस मैकी यह कोशिश करते हैं>>> import os; os.environ['FOO'] = ''; print(os.getenv('FOO', 'bar'))
लेवोन

भ्रामक विधि हस्ताक्षर 😜
क्रिस मैककी

1
@ क्रिस मैकी, एक अन्य उदाहरण$ FOO= python -c "import os; print(os.getenv('FOO', 'bar'))"
लेवॉन

3

यदि आप जांचना चाहते हैं कि क्या कई एनवी चर सेट नहीं हैं, तो आप निम्न कार्य कर सकते हैं:

import os

MANDATORY_ENV_VARS = ["FOO", "BAR"]

for var in MANDATORY_ENV_VARS:
    if var not in os.environ:
        raise EnvironmentError("Failed because {} is not set.".format(var))

-1

मेरी टिप्पणी दी गई टैग के लिए प्रासंगिक नहीं हो सकती है। हालाँकि, मैं अपनी खोज से इस पृष्ठ पर गया था। मैं आर में इसी तरह की जांच की तलाश में था और मैं @hugovdbeg पोस्ट की मदद से निम्नलिखित आया। मुझे उम्मीद है कि यह किसी ऐसे व्यक्ति के लिए उपयोगी होगा जो आर में इसी तरह के समाधान की तलाश कर रहा है

'USERNAME' %in% names(Sys.getenv())
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.