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.