Obter, engadir, sobreescribir e eliminar variables de entorno en Python (os.environ)

Negocios

As variables de contorno pódense recuperar, comprobar, configurar (engadir ou sobreescribir) e eliminar nos programas Python usando os.environ. Teña en conta que os cambios realizados configurando ou eliminando variables de entorno só son efectivos dentro do programa Python. Non significa que se reescriban as variables de contorno do sistema.

A seguinte información ofrécese aquí.

  • os.environ
  • Obter variables de entorno.
  • Establecer (engadir / sobreescribir) variables de entorno
  • Elimina as variables de contorno
  • Efecto das variables de contorno cambiantes
  • Cambio de procesos por variables de contorno

Importe e use o módulo OS. Dado que é unha biblioteca estándar, non se precisa instalación adicional. O módulo de subproceso tamén está incluído na biblioteca estándar.

import os
import subprocess

os.environ

O tipo de os.environ é os._Environ.

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

os._Environ é un obxecto de tipo mapa cun par de clave e valor e ten os mesmos métodos que un dicionario (tipo dict). O nome da variable de entorno é clave e o seu valor é valor.

O contido de os.environ cargarase cando se importa o módulo OS. O contido de os.environ non se actualizará aínda que as variables de contorno do sistema se cambien por outros medios mentres o programa está en execución.

A lista móstrase con print ().

# print(os.environ)

Do mesmo xeito que co dicionario, pode empregar os seguintes métodos ou usar para comprobar a existencia de claves e valores.

  • keys()
  • values()

O procesamento de claves e valores é basicamente o mesmo que para os dicionarios. A continuación ofrécense exemplos.

Obter variables de entorno.

os.environ[Environment variable name]
Isto permitiralle obter o valor da variable de entorno, pero se especifica un nome de variable de entorno que non existe, obterá un erro (KeyError).

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

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

O método get () de os.environ pode usarse para obter o valor predeterminado se non existe. Isto tamén é o mesmo que o dicionario.

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

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

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

Tamén se ofrece a función os.getenv (). Do mesmo xeito que o método get () do dicionario, devolve o valor predeterminado se a clave non existe. Esta función é útil se só quere obter e comprobar o valor dunha 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 (engadir / sobreescribir) variables de entorno

os.environ[Environment variable name]
Ao asignarlle un valor, pode establecer unha variable de entorno.

Cando se especifica un nome de variable de contorno novo, a variable de contorno engádese recentemente e cando se especifica un nome de variable de contorno existente, sobrescríbese o valor da variable de contorno.

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

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

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

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

Teña en conta que asignar calquera cousa que non sexa unha cadea producirá un erro (TypeError). Se queres asignar un valor numérico, especifícao como unha cadea.

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

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

Tamén se proporciona a función os.putenv (). Non obstante, o valor de os.environ non se actualiza cando o define os.putenv (). Por este motivo, é preferible especificar a clave (nome da variable de entorno) de os.environ e asignar o valor como se mostra no exemplo anterior.

Se se admite putenv (), a asignación a un elemento en os.environ converterase automaticamente nunha chamada correspondente a putenv (). Na práctica, asignar a un elemento en os.environ é a operación preferida, xa que unha chamada directa a putenv () non actualizará os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Como se mencionou anteriormente, os cambios realizados engadindo ou sobreescribindo variables de entorno só son efectivos dentro do programa Python. Non significa que se reescriban as variables de contorno do sistema.

Teña en conta que cambiar o valor pode causar unha fuga de memoria segundo o sistema operativo.

Nota: Nalgunhas plataformas, incluídas FreeBSD e Mac OS X, cambiar o valor do ambiente pode provocar unha fuga de memoria.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Isto débese á especificación putenv () do 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)

Elimina as variables de contorno

Para eliminar unha variable de entorno, use o método pop () de os.environ ou a instrución del. Igual que o dicionario.

O seguinte é un exemplo de pop ().

pop () devolve o valor da variable de entorno que se eliminou. Por defecto, especificar unha variable de entorno que non existe producirá un erro (KeyError), pero especificando o segundo argumento devolverá o valor da variable de entorno se non 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

O seguinte é un exemplo de del.

A variable de entorno engádese de novo e elimínase. Se a variable de entorno non existe, prodúcese un erro (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'

Tamén se proporciona a función os.unsetenv (). Non obstante, como ocorre con os.putenv (), o valor de os.environ non se actualiza cando o elimina os.unsetenv (). Polo tanto, é preferible especificar a clave (nome da variable de entorno) de os.environ e borrala como se mostra no exemplo anterior.

Se unsetenv () é compatible, a eliminación dun elemento en os.environ traducirase automaticamente á chamada correspondente a unsetenv (). Na práctica, eliminar elementos en os.environ é a operación preferida, xa que as chamadas directas a unsetenv () non actualizarán os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

A eliminación de variables de contorno tamén é efectiva só dentro dese programa Python. Non elimina as variables de contorno do sistema.

Efecto das variables de contorno cambiantes

Como escribín repetidamente, cambiar (axustar ou eliminar) a variable de entorno os.environ non cambia a variable de entorno do sistema, pero afecta aos subprocesos que se lanzan no programa.

O seguinte código non funcionará como se esperaba en Windows porque non hai ningunha variable de entorno LANG e o contido do comando date é diferente.

Chamando ao comando date no módulo de subproceso.

O resultado de saída do comando date cambia dependendo do valor da 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
# 

Por mor da explicación, cambiamos a variable de entorno LANG en os.environ, pero Python fornece un módulo local para controlar a configuración local.

Cambio de procesos por variables de contorno

Tamén é posible cambiar o proceso segundo o valor dunha variable de entorno.

Aquí tes un exemplo de cambio da saída segundo a variable de entorno LANG na configuración do idioma. Aquí estamos a usar o método startswith () para determinar se a cadea comeza coa cadea especificada, pero se desexa determinar a coincidencia exacta, pode 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')
# こんにちは

Ademais, se as variables de contorno están configuradas para indicar o contorno de desenvolvemento e o contorno de produción, por exemplo, pode obter os valores destas variables e cambiar o proceso.

Copied title and URL