it-swarm.com.de

Unterschied zwischen os.getenv und os.environ.get

Gibt es überhaupt einen Unterschied zwischen beiden Ansätzen?

>>> 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

Sie scheinen genau die gleiche Funktionalität zu haben.

121
André Staltz

Ein Unterschied beobachtet (Python27):

os.environ löst eine Ausnahme aus, wenn die Umgebungsvariable nicht vorhanden ist. os.getenv löst keine Ausnahme aus, gibt aber None zurück

38
giwyni

Siehe dieser verwandte Thread . Grundsätzlich gilt, os.environ wird beim Import gefunden und os.getenv ist ein Wrapper für os.environ.get, zumindest in CPython.

BEARBEITEN: Um auf einen Kommentar in CPython zu antworten, os.getenv ist im Grunde eine Verknüpfung zu os.environ.get; schon seit os.environ wird beim Import von os geladen, und nur dann gilt das Gleiche für os.getenv.

56

In Python 2.7 mit 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

Wir können also zu dem Schluss kommen, dass os.getenv Nur ein einfacher Wrapper um os.environ.get Ist.

32
Zulu

Während es keinen funktionalen Unterschied zwischen os.environ.get Und os.getenv Gibt, gibt es einen massiven Unterschied zwischen os.putenv und Eingabe von os.environ. os.putenv Ist defekt, daher sollten Sie standardmäßig os.environ.get Verwenden, um zu vermeiden, dass os.getenv Sie dazu auffordert, os.putenv Für die Symmetrie zu verwenden .

os.putenv Ändert die tatsächlichen Umgebungsvariablen auf Betriebssystemebene, jedoch auf eine Weise, die nicht durch os.getenv, os.environ Oder eine andere stdlib-Methode zum Überprüfen von Umgebungsvariablen angezeigt wird:

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

Wahrscheinlich müssten Sie einen ctypes-Aufruf an die C-Ebene getenv senden, um die realen Umgebungsvariablen nach dem Aufruf von os.putenv Anzuzeigen. (Das Starten eines Shell-Subprozesses und das Abfragen seiner Umgebungsvariablen funktioniert möglicherweise auch, wenn Sie sehr vorsichtig mit dem Escape-Befehl und --norc/--noprofile/Allem anderen sind, was Sie tun müssen, um eine Startkonfiguration zu vermeiden. aber es scheint viel schwieriger zu sein, es richtig zu machen.)

7
user2357112

Zusätzlich zu den obigen Antworten:

$ 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
fredrik