Diferencia entre os.getenv y os.environ.get

6 minutos de lectura

avatar de usuario
André Staltz

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

avatar de usuario
W.Conrad Walden

Ver este hilo relacionado. Básicamente, os.environ se encuentra en la importación, y os.getenv es un envoltorio para os.environ.getal menos en CPython.

EDITAR: Para responder a un comentario, en CPython, os.getenv es básicamente un atajo para os.environ.get ; ya que os.environ se carga en la importación de osy solo entonces, lo mismo vale para
os.getenv.

  • De hecho, lo es, según el documento oficial: docs.python.org/3/library/os.html

    – ivanleoncz

    18 de abril de 2019 a las 7:02

  • Del hilo relacionado vinculado: “la razón principal para usar os.getenv() […] es cuando desea que se devuelva un valor predeterminado cuando no se encuentra un nombre de variable de entorno en os.environlas llaves de en lugar de tener un KeyError o lo que sea que se arroje, y desea guardar algunos caracteres”.

    – ladrón de mentes

    11 de agosto de 2019 a las 2:12

  • os.environ.get no tira KeyError.

    – Sam Brightman

    29 de octubre de 2020 a las 12:58

avatar de usuario
giwyni

Una diferencia (observada en Python 2.7 y 3.8) entre getenv() y environ[]:

  • os.getenv() no genera una excepción, pero devuelve Ninguno
  • os.environ.get() de forma similar devuelve Ninguno
  • os.environ[] genera una excepción si la variable ambiental no existe

  • El OP pregunta por os.environ.get() que regresa None (a menos que se especifique lo contrario) y nunca genera una excepción si el env. variedad no existe Tus cosas confusas con el uso os.environ['TERM'] que no es de lo que trata la pregunta.

    – Antonio

    21 de abril de 2017 a las 7:41

  • los OP pregunta pregunta sobre os.environ.get() contra os.getenv() pero el cuerpo también contiene os.environ contra os.environ.get() entonces esta respuesta es correcta en al menos algunos aspectos: incompleta, pero correcta.

    – FKEinternet

    1 de julio de 2019 a las 18:12

  • Esta respuesta incorrecta y engañosa debería haber recibido votos negativos. La siguiente respuesta es la correcta.

    – Ray Luo

    11 de abril de 2020 a las 0:33

  • Alguien editó esta respuesta para “arreglarla” y ahora hay un montón de viejos votos negativos y comentarios sobre ella… Hubiera sido mejor simplemente votarla negativamente y publicar la solución en una nueva respuesta.

    – nyuszika7h

    23 de noviembre de 2021 a las 14:51

  • @nyuszika7h – Las revisiones anteriores eran vagas – simplemente decían os.environ generaría una excepción si la variable no existiera. no dijeron claramente os.environ[] que es lo que ahora estamos elogiando como correcto, o os.environ.get() que es lo que creo que algunas personas estaban asumiendo y criticando por estar equivocado. La última actualización los menciona claramente a ambos y describe con precisión todos sus comportamientos.

    – El arte de la guerra

    2 de febrero a las 16:16

En Python 2.7 con 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

Entonces podemos concluir os.getenv es solo un simple envoltorio alrededor os.environ.get.

  • En python3, cuando hago os.getenv?? Recibo el siguiente error Archivo ““, línea 1 os.getenv??

    – thanos.a

    29 de enero de 2021 a las 13:55


  • @thanos.a Yo uso la sintaxis de iPython

    – Zulú

    29 de enero de 2021 a las 16:32

Aunque no hay diferencia funcional entre os.environ.get y os.getenvhay un masivo diferencia entre os.putenv y establecer entradas en os.environ. os.putenv es rotopor lo que debe establecer por defecto os.environ.get simplemente para evitar el camino os.getenv te anima a usar os.putenv por simetría.

os.putenv cambia las variables de entorno reales del nivel del sistema operativo, pero de una manera que no se muestra a través de os.getenv, os.environo cualquier otra forma stdlib de inspeccionar las variables de entorno:

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

Probablemente tendría que hacer una llamada ctypes al nivel C getenv para ver las variables de entorno real después de llamar os.putenv. (Lanzar un subproceso de shell y pedirle sus variables de entorno también podría funcionar, si tiene mucho cuidado con escapar y --norc/--noprofile/cualquier otra cosa que necesite hacer para evitar la configuración de inicio, pero parece mucho más difícil hacerlo bien).

avatar de usuario
fredrick

Además de las respuestas anteriores:

$ 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

EDITAR: significado, no hay diferencia

  • ¿Con qué versión de Python has probado? En 3.7.2, os.getenv es solo un envoltorio para os.environ.getpor lo que obtengo una sobrecarga mínima.

    – Preslav Rachev

    7 de enero de 2019 a las 15:19

  • Eso fue 3.7.1 en macOS Mojave. Los tiempos fueron bastante consistentes.

    – Fredrik

    7 de enero de 2019 a las 16:51

  • @PreslavRachev mínimo o no, es una llamada de función adicional, por lo que hay algunos gastos generales. Dicho esto, probablemente no necesite recuperar variables env en medio de su ciclo interno.

    – pmav99

    24 de febrero de 2019 a las 14:08

  • Totalmente irrelevante. Microoptimización de una sola llamada de función… De todos modos, cualquier aplicación debería leer el entorno solo en el arranque, lo que hace que esto sea aún más irrelevante.

    – Víctor Schröder

    26 de marzo de 2019 a las 14:06

  • POR CIERTO, usec es un microsegundo en timeit. La diferencia encontrada en este micro-benchmarking fue de 0,18 microsegundos…

    – Víctor Schröder

    26 de marzo de 2019 a las 14:08

  • ¿Con qué versión de Python has probado? En 3.7.2, os.getenv es solo un envoltorio para os.environ.getpor lo que obtengo una sobrecarga mínima.

    – Preslav Rachev

    7 de enero de 2019 a las 15:19

  • Eso fue 3.7.1 en macOS Mojave. Los tiempos fueron bastante consistentes.

    – Fredrik

    7 de enero de 2019 a las 16:51

  • @PreslavRachev mínimo o no, es una llamada de función adicional, por lo que hay algunos gastos generales. Dicho esto, probablemente no necesite recuperar variables env en medio de su ciclo interno.

    – pmav99

    24 de febrero de 2019 a las 14:08

  • Totalmente irrelevante. Microoptimización de una sola llamada de función… De todos modos, cualquier aplicación debería leer el entorno solo en el arranque, lo que hace que esto sea aún más irrelevante.

    – Víctor Schröder

    26 de marzo de 2019 a las 14:06

  • POR CIERTO, usec es un microsegundo en timeit. La diferencia encontrada en este micro-benchmarking fue de 0,18 microsegundos…

    – Víctor Schröder

    26 de marzo de 2019 a las 14:08

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad