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

5 Comentarios

  1. 37

    Una diferencia observada (Python27):

    os.environ levanta una excepción si la variable ambiental no existe.
    os.getenv no provoca una excepción, pero devuelve None

    • El OP pregunta acerca de os.environ.get() que devuelve None (a menos que se especifique de manera diferente) y nunca levanta una excepción si el env. var. no existe. Su confundir las cosas con el uso de os.environ['TERM'] que no es lo que la pregunta es acerca de.
    • El OP pregunta le pregunta acerca de os.environ.get() vs os.getenv() pero el cuerpo también incluye os.environ vs os.environ.get() por lo que esta respuesta correcta, al menos en algunos aspectos incompleto, pero correcto.
  2. 58

    Ver esta relacionado con el hilo. Básicamente, os.environ se encuentra en la importación y os.getenv es un contenedor para os.environ.get, al menos en CPython.

    EDITAR: Para responder a un comentario, en CPython, os.getenv es básicamente un acceso directo a os.environ.get ; desde os.environ es cargado en la importación de os, y sólo entonces, lo mismo vale para
    os.getenv.

    • En efecto, es, según el funcionario doc: docs.python.org/3/library/os.html
    • A partir de los enlaces relacionados con el tema: «la principal razón para utilizar os.getenv() […] es cuando se desea tener un valor por defecto devuelve cuando un nombre de variable de entorno no se encuentra en os.environ‘s claves en lugar de tener un KeyError o lo que sea lanzado, y usted quiere guardar un par de personajes.»
  3. 35

    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

    Lo que podemos concluir os.getenv es un simple contenedor de os.environ.get.

  4. 8

    Mientras que no hay ninguna diferencia funcional entre os.environ.get y os.getenv, hay un masiva diferencia entre os.putenv y la configuración de las entradas en os.environ. os.putenv es roto, por lo que en caso de incumplimiento a os.environ.get simplemente para evitar el camino os.getenv promueve el uso de os.putenv de simetría.

    os.putenv cambia el SO real a nivel de variables de entorno, pero de una manera que no se muestra a través de os.getenv, os.environ, o cualquier otro stdlib manera de inspeccionar 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 tenga que hacer un ctypes llamada al C-nivel de getenv para ver las variables de entorno después de llamar a os.putenv. (Iniciar un shell subproceso y pidiendo por sus variables de entorno podría funcionar también, si usted es muy cuidadoso acerca de escape y --norc/--noprofile/cualquier otra cosa que usted necesita hacer para evitar la configuración de inicio, pero parece mucho más difícil de conseguir.)

  5. 3

    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
    • Que versión de Python has probado con. En 3.7.2, os.getenv es simplemente un contenedor para os.environ.get, así que me estoy poniendo muy sobrecarga mínima.
    • Que fue 3.7.1 en macOS Mojave. Los tiempos fueron muy consistentes.
    • mínima o no es un extra llamada a la función, por lo que hay cierta sobrecarga. Dicho esto, usted probablemente no necesite recuperar env variables en el medio de su bucle interno.
    • Totalmente irrelevante. Micro-optimización de una función única de llamadas… Cualquier aplicación que se debe leer el medio ambiente sólo en bootstrap de todos modos, esta haciendo aún más irrelevante.
    • Por CIERTO, usec es un microsegundo en timeit. La diferencia encontrada en este micro-benchmarking fue de 0,18 microsegundos…

Dejar respuesta

Please enter your comment!
Please enter your name here