Obtenir, afegir, sobreescriure i suprimir variables d’entorn a Python (os.environ)

Negocis

Les variables d’entorn es poden recuperar, comprovar, configurar (afegir o sobreescriure) i suprimir als programes Python mitjançant os.environ. Tingueu en compte que els canvis realitzats mitjançant la configuració o la supressió de variables d’entorn només són efectius dins del programa Python. No vol dir que es reescrivin les variables d’entorn del sistema.

Aquí es proporciona la informació següent.

  • os.environ
  • Obteniu variables d’entorn.
  • Estableix (afegeix / sobreescriu) variables d’entorn
  • Elimineu les variables d’entorn
  • Efecte del canvi de variables d’entorn
  • Canvi de processos per variables d’entorn

Importeu i utilitzeu el mòdul OS. Com que és una biblioteca estàndard, no cal cap instal·lació addicional. El mòdul de subprocés també s’inclou a la biblioteca estàndard.

import os
import subprocess

os.environ

El tipus d’os.environ és os._Environ.

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

os._Environ és un objecte de tipus mapa amb un parell de claus i valor i té els mateixos mètodes que un diccionari (tipus dict). El nom de la variable d’entorn és clau i el seu valor és valor.

El contingut d’os.environ es carregarà quan s’importi el mòdul os. El contingut d’os.environ no s’actualitzarà fins i tot si les variables d’entorn del sistema es canvien per altres mitjans mentre s’executa el programa.

La llista es mostra amb print ().

# print(os.environ)

Igual que amb el diccionari, podeu utilitzar els mètodes següents o bé utilitzar-los per comprovar l’existència de claus i valors.

  • keys()
  • values()

El processament de claus i valors és bàsicament el mateix que per als diccionaris. A continuació es donen exemples.

Obteniu variables d’entorn.

os.environ[Environment variable name]
Això us permetrà obtenir el valor de la variable d’entorn, però si especifiqueu un nom de variable d’entorn que no existeix, obtindreu un error (KeyError).

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

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

El mètode get () d’os.environ es pot utilitzar per obtenir el valor per defecte si no existeix. Això també és el mateix que el diccionari.

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

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

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

També es proporciona la funció os.getenv (). Igual que el mètode get () del diccionari, torna el valor per defecte si la clau no existeix. Aquesta funció és útil si només voleu obtenir i comprovar el valor d’una variable d’entorn.

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

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

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

Estableix (afegeix / sobreescriu) variables d’entorn

os.environ[Environment variable name]
Assignant-li un valor, podeu establir una variable d’entorn.

Quan s’especifica un nou nom de variable d’entorn, s’afegeix la variable d’entorn i, quan s’especifica un nom de variable d’entorn existent, se sobreescriu el valor de la variable d’entorn.

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

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

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

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

Tingueu en compte que assignar qualsevol cosa que no sigui una cadena donarà lloc a un error (TypeError). Si voleu assignar un valor numèric, especifiqueu-lo com una cadena.

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

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

També es proporciona la funció os.putenv (). Tot i això, el valor d’os.environ no s’actualitza quan el defineix os.putenv (). Per aquest motiu, és preferible especificar la clau (nom de la variable d’entorn) d’os.environ i assignar el valor tal com es mostra a l’exemple anterior.

Si s’admet putenv (), una assignació a un element a os.environ es convertirà automàticament en una trucada corresponent a putenv (). A la pràctica, assignar a un element a os.environ és l’operació preferida, ja que una trucada directa a putenv () no actualitzarà os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Com s’ha esmentat anteriorment, els canvis realitzats afegint o sobreescrivint variables d’entorn només són efectius dins del programa Python. No vol dir que es reescrivin les variables d’entorn del sistema.

Tingueu en compte que el canvi del valor pot provocar una fuita de memòria en funció del sistema operatiu.

Nota: en algunes plataformes, incloses FreeBSD i Mac OS X, canviar el valor de l’entorn pot provocar fuites de memòria.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Això es deu a l’especificació putenv () del propi 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)

Elimineu les variables d’entorn

Per suprimir una variable d’entorn, utilitzeu el mètode pop () d’os.environ o la sentència del. Igual que el diccionari.

El següent és un exemple de pop ().

pop () retorna el valor de la variable d’entorn que s’ha suprimit. Per defecte, especificar una variable d’entorn que no existeix donarà lloc a un error (KeyError), però especificar el segon argument retornarà el valor de la variable d’entorn si no existeix.

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 següent és un exemple de del.

La variable d’entorn es torna a afegir i després se suprimeix. Si la variable d’entorn no existeix, es produirà 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'

També es proporciona la funció os.unsetenv (). Tanmateix, igual que amb os.putenv (), el valor d’os.environ no s’actualitza quan és suprimit per os.unsetenv (). Per tant, és preferible especificar la clau (nom de la variable d’entorn) d’os.environ i eliminar-la tal com es mostra a l’exemple anterior.

Si s’admet unsetenv (), suprimir un element a os.environ es traduirà automàticament a la trucada corresponent a unsetenv (). A la pràctica, suprimir elements a os.environ és l’operació preferida, ja que les trucades directes a unsetenv () no actualitzaran os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

La supressió de variables d’entorn també només és efectiva dins d’aquest programa Python. No elimina les variables d’entorn del sistema.

Efecte del canvi de variables d’entorn

Com he escrit repetidament, canviar (configurar o suprimir) la variable d’entorn os.environ no canvia la variable d’entorn del sistema, però afecta els subprocessos que s’inicien al programa.

El següent codi no funcionarà com s’esperava a Windows perquè no hi ha cap variable d’entorn LANG i el contingut de l’ordre date és diferent.

Cridant l’ordre data al mòdul de subprocés.

El resultat de sortida de l’ordre data canvia en funció del valor de la variable d’entorn 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
# 

Per motius d’explicació, hem canviat la variable d’entorn LANG a os.environ, però Python proporciona un mòdul local per controlar la configuració regional.

Canvi de processos per variables d’entorn

També és possible canviar el procés segons el valor d’una variable d’entorn.

Aquí teniu un exemple de canvi de la sortida segons la variable d’entorn LANG a la configuració d’idioma. Aquí fem servir el mètode startswith () per determinar si la cadena comença amb la cadena especificada, però si voleu determinar la coincidència exacta, podeu utilitzar “==” per 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')
# こんにちは

A més, si les variables d’entorn s’estableixen per indicar l’entorn de desenvolupament i l’entorn de producció, per exemple, podeu obtenir els valors d’aquestes variables i canviar el procés.

Copied title and URL