¿Hay alguna diferencia entre ambos enfoques?
>>> 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
Parecen tener exactamente la misma funcionalidad.
python
environment-variables
python-os
André Staltz
fuente
fuente
os.environ.get()
qué retornosNone
(a menos que se especifique lo contrario) y nunca genera una excepción si el env. var. no existe Sus cosas confusas con el usoos.environ['TERM']
que no es de lo que se trata la pregunta.os.environ.get()
vs,os.getenv()
pero el cuerpo también incluyeos.environ
vs,os.environ.get()
por lo que esta respuesta es correcta al menos en algunos aspectos: incompleta, pero correcta.Ver este hilo relacionado . Básicamente,
os.environ
se encuentra en la importación, yos.getenv
es un contenedor paraos.environ.get
, al menos en CPython.EDITAR: Para responder a un comentario, en CPython,
os.getenv
es básicamente un acceso directo aos.environ.get
; ya queos.environ
se carga en la importación deos
, y solo entonces, lo mismo vale paraos.getenv
.fuente
os.getenv()
[...] es cuando desea que se devuelva un valor predeterminado cuando no se encuentra un nombre de variable de entorno enos.environ
las claves de las teclas en lugar de tener unKeyError
o lo que sea lanzado, y usted querer guardar algunos caracteres ".En Python 2.7 con iPython:
Por lo tanto, podemos concluir que
os.getenv
es solo una simple envolturaos.environ.get
.fuente
Si bien no existe una diferencia funcional entre
os.environ.get
yos.getenv
, existe una gran diferencia entreos.putenv
y establecer entradas enos.environ
.os.putenv
está roto , por lo que debe usaros.environ.get
simplemente para evitar la forma en que loos.getenv
alienta a usaros.putenv
para la simetría.os.putenv
cambia las variables de entorno del sistema operativo de nivel, pero de una manera que no se presenta a través deos.getenv
,os.environ
o de cualquier otra manera stdlib de inspeccionar las variables de entorno:Probablemente tendría que hacer una llamada de ctypes al nivel C
getenv
para ver las variables de entorno reales después de llamaros.putenv
. (Iniciar un subproceso de shell y preguntarle por sus variables de entorno también podría funcionar, si tiene mucho cuidado con el escape y--norc
/--noprofile
o cualquier otra cosa que necesite hacer para evitar la configuración de inicio, pero parece mucho más difícil hacerlo bien).fuente
Además de las respuestas anteriores:
fuente
os.getenv
es solo un contenedor paraos.environ.get
, por lo que obtengo una sobrecarga muy mínima.usec
es un microsegundo entimeit
. La diferencia encontrada en este micro-benchmarking fue de 0.18 microsegundos ...