web-dev-qa-db-fra.com

Différence entre os.getenv et os.environ.get

Y a-t-il une différence entre les deux approches?

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

Ils semblent avoir exactement la même fonctionnalité.

121
André Staltz

Une différence observée (Python27):

os.environ déclenche une exception si la variable d'environnement n'existe pas. os.getenv ne déclenche pas d'exception, mais retourne None

38
giwyni

Voir ce fil connexe . Fondamentalement, os.environ est trouvé lors de l'importation et os.getenv est un wrapper pour os.environ.get, au moins dans CPython.

EDIT: Pour répondre à un commentaire, dans CPython, os.getenv est essentiellement un raccourci vers os.environ.get; puisque os.environ est chargé lors de l'importation de os, et seulement ensuite, il en va de même pour os.getenv.

56
W. Conrad Walden

Dans Python 2.7 avec 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

Nous pouvons donc en conclure que os.getenv n'est qu'un simple wrapper autour de os.environ.get.

32
Zulu

Bien qu'il n'y ait pas de différence fonctionnelle entre os.environ.get et os.getenv, il existe une différence massive entre os.putenv et le réglage les entrées sur os.environ. os.putenv est brisé, vous devriez donc utiliser par défaut os.environ.get simplement pour éviter la façon dont os.getenv vous encourage à utiliser os.putenv pour la symétrie.

os.putenv modifie les variables d'environnement réelles au niveau du système d'exploitation, mais d'une manière qui ne s'affiche pas par le biais de os.getenv, os.environ ou de tout autre moyen stdlib d'inspection des variables d'environnement:

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

Vous devrez probablement faire un appel ctypes au getenv de niveau C pour voir les variables d’environnement réelles après avoir appelé os.putenv. (Lancer un sous-processus Shell et lui demander ses variables d’environnement peut également fonctionner, si vous faites très attention à l’échappement et au --norc/--noprofile/à tout ce que vous devez faire pour éviter la configuration de démarrage. semble beaucoup plus difficile à obtenir.)

7
user2357112

En plus des réponses ci-dessus:

$ 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