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é.
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
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
.
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
.
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.)
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