Obtener, añadir, sobrescribir y eliminar variables de entorno en Python (os.environ)

Negocio

Las variables de entorno se pueden recuperar, comprobar, establecer (añadir o sobrescribir) y eliminar en los programas de Python utilizando os.environ. Tenga en cuenta que los cambios realizados al establecer o borrar variables de entorno son efectivos sólo dentro del programa Python. No significa que las variables de entorno del sistema se reescriban.

La siguiente información se proporciona aquí.

  • os.environ
  • Obtenga las variables de entorno.
  • Establecer (add\overwrite) variables de entorno
  • Eliminar las variables de entorno
  • Efecto de la modificación de las variables del entorno
  • Cambio de procesos por variables de entorno

Importe y utilice el módulo os. Como es una biblioteca estándar, no se requiere ninguna instalación adicional. El módulo subproceso también está incluido en la biblioteca estándar.

import os
import subprocess

os.entorno

El tipo de os.environ es os._Environ.

print(type(os.environ))
# <class 'os._Environ'>

os._Environ es un objeto de tipo map con un par de claves y valores, y tiene los mismos métodos que un diccionario (tipo dict). El nombre de la variable de entorno es key, y su valor es value.

El contenido de os.environ se cargará cuando se importe el módulo os. El contenido de os.environ no se actualizará aunque las variables de entorno del sistema se modifiquen por otros medios mientras se ejecuta el programa.

La lista se muestra con print().

# print(os.environ)

Al igual que con el diccionario, puede utilizar los siguientes métodos, o utilizar in para comprobar la existencia de claves y valores.

  • keys()
  • values()

El tratamiento de las claves y los valores es básicamente el mismo que el de los diccionarios. A continuación se dan ejemplos.

Obtenga las variables de entorno.

os.environ[Environment variable name]
Esto le permitirá obtener el valor de la variable de entorno, pero si especifica un nombre de variable de entorno que no existe, obtendrá un error (KeyError).

print(os.environ['LANG'])
# ja_JP.UTF-8

# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'

El método get() de os.environ puede utilizarse para obtener el valor por defecto si no existe. Esto también es lo mismo que el diccionario.

print(os.environ.get('LANG'))
# ja_JP.UTF-8

print(os.environ.get('NEW_KEY'))
# None

print(os.environ.get('NEW_KEY', 'default'))
# default

También se proporciona la función os.getenv(). Al igual que el método get() del diccionario, devuelve el valor por defecto si la clave no existe. Esta función es útil si sólo quiere obtener y comprobar el valor de una variable de entorno.

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(os.getenv('NEW_KEY'))
# None

print(os.getenv('NEW_KEY', 'default'))
# default

Establecer (add\overwrite) variables de entorno

os.environ[Environment variable name]
Asignando un valor a esto, puedes establecer una variable de entorno.

Cuando se especifica un nuevo nombre de variable de entorno, la variable de entorno se añade de nuevo, y cuando se especifica un nombre de variable de entorno existente, el valor de la variable de entorno se sobrescribe.

os.environ['NEW_KEY'] = 'test'

print(os.environ['NEW_KEY'])
# test

os.environ['NEW_KEY'] = 'test2'

print(os.environ['NEW_KEY'])
# test2

Tenga en cuenta que la asignación de cualquier cosa que no sea una cadena dará lugar a un error (TypeError). Si desea asignar un valor numérico, especifíquelo como una cadena.

# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int

os.environ['NEW_KEY'] = '100'

También se proporciona la función os.putenv(). Sin embargo, el valor de os.environ no se actualiza cuando es establecido por os.putenv(). Por esta razón, es preferible especificar la clave (nombre de la variable de entorno) de os.environ y asignar el valor como se muestra en el ejemplo anterior.

Si putenv() está soportado, una asignación a un elemento en os.environ se convertirá automáticamente en una llamada correspondiente a putenv(). En la práctica, la asignación a un elemento de os.environ es la operación preferida, ya que una llamada directa a putenv() no actualizará os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Como se mencionó anteriormente, los cambios realizados al agregar o sobrescribir variables de entorno son efectivos sólo dentro del programa Python. No significa que las variables de entorno del sistema se reescriban.

Tenga en cuenta que cambiar el valor puede causar una fuga de memoria dependiendo del sistema operativo.

Nota: En algunas plataformas, incluyendo FreeBSD y Mac OS X, cambiar el valor de environ puede causar una fuga de memoria.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Esto se debe a la especificación putenv() del propio SO.

Successive calls to setenv() or putenv() assigning a differently sized value to the same name will result in a memory leak. The FreeBSD seman-tics semantics for these functions (namely, that the contents of value are copied and that old values remain accessible indefinitely) make this bug unavoidable.
Mac OS X Manual Page For putenv(3)

Eliminar las variables de entorno

Para eliminar una variable de entorno, utilice el método pop() de os.environ o la sentencia del. Lo mismo que el diccionario.

El siguiente es un ejemplo de pop().

pop() devuelve el valor de la variable de entorno que se ha eliminado. Por defecto, si se especifica una variable de entorno que no existe se producirá un error (KeyError), pero si se especifica el segundo argumento se devolverá el valor de la variable de entorno si no existe.

print(os.environ.pop('NEW_KEY'))
# 100

# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'

print(os.environ.pop('NEW_KEY', None))
# None

El siguiente es un ejemplo de del.

La variable de entorno se añade de nuevo y luego se elimina. Si la variable de entorno no existe, se produce un error (KeyError).

os.environ['NEW_KEY'] = '100'

print(os.getenv('NEW_KEY'))
# 100

del os.environ['NEW_KEY']

print(os.getenv('NEW_KEY'))
# None

# del os.environ['NEW_KEY']
# KeyError: 'NEW_KEY'

También se proporciona la función os.unsetenv(). Sin embargo, al igual que con os.putenv(), el valor de os.environ no se actualiza cuando es borrado por os.unsetenv(). Por lo tanto, es preferible especificar la clave (nombre de la variable de entorno) de os.environ y borrarla como se muestra en el ejemplo anterior.

Si se soporta unsetenv(), borrar un elemento en os.environ se traducirá automáticamente en la correspondiente llamada a unsetenv(). En la práctica, borrar elementos en os.environ es la operación preferida, ya que las llamadas directas a unsetenv() no actualizarán os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

La eliminación de las variables de entorno también es efectiva sólo dentro de ese programa de Python. No elimina las variables de entorno del sistema.

Efecto de la modificación de las variables del entorno

Como he escrito repetidamente, cambiar (establecer o borrar) la variable de entorno os.environ no cambia la variable de entorno del sistema, pero sí afecta a los subprocesos que se lanzan en el programa.

El siguiente código no funcionará como se espera en Windows porque no hay una variable de entorno LANG y el contenido del comando date es diferente.

Llamada al comando de fecha en el módulo de subproceso.

El resultado de la salida del comando date cambia en función del valor de la variable de entorno LANG.

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(subprocess.check_output('date', encoding='utf-8'))
# 2018年 7月12日 木曜日 20時54分13秒 JST
# 

os.environ['LANG'] = 'en_US'

print(subprocess.check_output('date', encoding='utf-8'))
# Thu Jul 12 20:54:13 JST 2018
# 

En aras de la explicación, hemos cambiado la variable de entorno LANG en os.environ, pero Python proporciona un módulo locale para controlar la configuración regional.

Cambio de procesos por variables de entorno

También es posible cambiar el proceso según el valor de una variable de entorno.

Aquí hay un ejemplo de cambiar la salida de acuerdo a la variable de entorno LANG en la configuración del idioma. Aquí estamos usando el método startswith() para determinar si la cadena comienza con la cadena especificada, pero si quiere determinar la coincidencia exacta, puede usar «==» para comparar.

print(os.getenv('LANG'))
# en_US

if os.getenv('LANG').startswith('ja'):
    print('こんにちは')
else:
    print('Hello')
# Hello

os.environ['LANG'] = 'ja_JP'

if os.getenv('LANG').startswith('ja'):
    print('こんにちは')
else:
    print('Hello')
# こんにちは

Además, si se establecen variables de entorno para indicar el entorno de desarrollo y el entorno de producción, por ejemplo, puede obtener los valores de estas variables y cambiar el proceso.

Copied title and URL