Os.getenv और os.environ.get के बीच अंतर


159

क्या दोनों दृष्टिकोणों में कोई अंतर है?

>>> os.getenv('TERM')
'xterm'
>>> os.environ.get('TERM')
'xterm'

>>> os.getenv('FOOBAR', "not found") == "not found"
True
>>> os.environ.get('FOOBAR', "not found") == "not found"
True

वे एक ही कार्यक्षमता के लिए लगता है।

जवाबों:


60

मनाया गया एक अंतर (Python27):

os.environयदि पर्यावरण चर मौजूद नहीं है, तो एक अपवाद उठाता है। os.getenvकोई अपवाद नहीं बढ़ाता है, लेकिन कोई भी नहीं लौटाता है


119
ओपी पूछता है कि os.environ.get()कौन से रिटर्न None(जब तक कि अलग-अलग निर्दिष्ट नहीं किए गए हैं) और कभी भी एक अपवाद नहीं बढ़ाता है यदि एन.वी. वर। मौजूद नहीं है। आपकी भ्रमित करने वाली चीजें जिनके उपयोग os.environ['TERM']से ऐसा नहीं है कि सवाल क्या है।
एंथन

2
ओपी का प्रश्नos.environ.get() बनाम के बारे में पूछता है os.getenv()लेकिन शरीर में भी os.environबनाम शामिल है os.environ.get()इसलिए यह उत्तर कम से कम कुछ तरीकों से सही है - अपूर्ण, लेकिन सही है।
FKEinternet

3
इस गलत और भ्रामक उत्तर को नकारात्मक डाउन वोट प्राप्त करना चाहिए था। अगला उत्तर सही है।
रायलू

80

इससे संबंधित धागा देखें । मूल रूप से, os.environआयात पर पाया जाता है, और कम से कम CPython में os.getenvएक आवरण है os.environ.get

संपादित करें: सीपीथॉन में एक टिप्पणी का जवाब देने के लिए, os.getenvमूल रूप से एक शॉर्टकट है os.environ.get; जब os.environसे आयात पर लोड किया जाता है os, और उसके बाद ही, उसी के लिए आयोजित किया जाता है os.getenv


1
वास्तव में, यह आधिकारिक डॉक्टर के अनुसार है: docs.python.org/3/library/os.html
ivanleoncz

1
लिंक किए गए संबंधित थ्रेड से: "उपयोग करने का मुख्य कारण os.getenv()[...] है जब आप एक डिफ़ॉल्ट मान वापस लौटना चाहते हैं जब एक पर्यावरण चर नाम os.environकुंजी के बजाय एक KeyErrorया जो भी फेंका गया हो, और आपको नहीं मिला है कुछ पात्रों को बचाना चाहते हैं। ”
माइंडफिट

35

पायथन 2.7 में iPython के साथ:

>>> import os
>>> os.getenv??
Signature: os.getenv(key, default=None)
Source:
def getenv(key, default=None):
    """Get an environment variable, return None if it doesn't exist.
    The optional second argument can specify an alternate default."""
    return environ.get(key, default)
File:      ~/venv/lib/python2.7/os.py
Type:      function

तो हम निष्कर्ष निकाल सकते हैं os.getenvकि बस एक साधारण आवरण है os.environ.get


16

जबकि os.environ.getऔर के बीच कोई कार्यात्मक अंतर नहीं है os.getenv, और प्रविष्टियों को सेट करने के बीच एक बड़ा अंतर है । है टूट , तो आप के लिए डिफ़ॉल्ट चाहिए बस जिस तरह से बचने के लिए आप का उपयोग करने के लिए प्रोत्साहित करती है समरूपता के लिए।os.putenvos.environos.putenvos.environ.getos.getenvos.putenv

os.putenvवास्तविक ओएस स्तरीय वातावरण चर बदलता है, लेकिन एक तरह से है कि के माध्यम से दिखाई नहीं देता os.getenv, os.environया वातावरण चर निरीक्षण के किसी भी अन्य stdlib रास्ता:

>>> import os
>>> os.environ['asdf'] = 'fdsa'
>>> os.environ['asdf']
'fdsa'
>>> os.putenv('aaaa', 'bbbb')
>>> os.getenv('aaaa')
>>> os.environ.get('aaaa')

आपको शायद कॉल करने के getenvबाद वास्तविक वातावरण चर को देखने के लिए C-स्तर पर ctypes कॉल करना होगा os.putenv। (शेल उपप्रकार को लॉन्च करना और उसके पर्यावरण चर के लिए यह पूछना भी काम कर सकता है, अगर आप भागने के बारे में बहुत सावधान हैं और --norc/ --noprofileया कुछ और जो आपको स्टार्टअप कॉन्फ़िगरेशन से बचने के लिए करने की आवश्यकता है, लेकिन सही होने के लिए बहुत कठिन लगता है।)


2

उपरोक्त उत्तरों के अलावा:

$ python3 -m timeit -s 'import os' 'os.environ.get("TERM_PROGRAM")'
200000 loops, best of 5: 1.65 usec per loop

$ python3 -m timeit -s 'import os' 'os.getenv("TERM_PROGRAM")'
200000 loops, best of 5: 1.83 usec per loop

पायथन के किस संस्करण के साथ आपने परीक्षण किया है। 3.7.2 पर, os.getenvकेवल एक आवरण है os.environ.get, इसलिए मुझे बहुत कम ओवरहेड मिल रहा है।
प्रिस्लेव रचेव

जो कि macOS Mojave पर 3.7.1 था। समय बहुत संगत थे।
फ्रेड्रिक

@PreslavRachev न्यूनतम या नहीं यह एक अतिरिक्त फ़ंक्शन कॉल है, इसलिए कुछ ओवरहेड है। कहा जा रहा है, आप शायद अपने भीतर के पाश के बीच में env चर प्राप्त करने की जरूरत नहीं है।
pmav99

7
पूरी तरह से अप्रासंगिक। किसी एकल फ़ंक्शन कॉल का माइक्रो-ऑप्टिमाइज़ेशन ... किसी भी एप्लिकेशन को पर्यावरण को बूटस्ट्रैप पर वैसे भी पढ़ना चाहिए, जिससे यह और भी अप्रासंगिक हो जाए।
विक्टर श्रोडर

1
BTW, usecमें एक माइक्रोसेकंड है timeit। इस सूक्ष्म बेंचमार्किंग में पाया गया अंतर 0.18 माइक्रोसेकंड था ...
विक्टर श्रोडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.