Spremenljivke okolja lahko v programih Python pridobite, preverite, nastavite (dodate ali prepišete) in izbrišete z uporabo os.environ. Upoštevajte, da spremembe, ki jih naredite z nastavljanjem ali brisanjem spremenljivk okolja, veljajo samo znotraj programa Python. To ne pomeni, da bodo sistemske okoljske spremenljivke na novo zapisane.
Tu so na voljo naslednje informacije.
os.environ
- Pridobite spremenljivke okolja.
- Nastavitev (add\overwrite) spremenljivk okolja
- Odstranjevanje spremenljivk okolja
- Učinek spreminjanja okoljskih spremenljivk
- Preklapljanje procesov s spremenljivkami okolja
Uvozite in uporabite modul os. Ker gre za standardno knjižnico, dodatna namestitev ni potrebna. V standardno knjižnico je vključen tudi modul podproces.
import os
import subprocess
os.environ
Vrsta os.environ je os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ je objekt tipa map s parom ključa in vrednosti, ki ima enake metode kot slovar (tip dict). Ime spremenljivke okolja je key, njena vrednost pa value.
Vsebina os.environ se naloži, ko je uvožen modul os. Vsebina os.environ se ne posodobi, tudi če se spremenljivke sistemskega okolja med izvajanjem programa spremenijo na drug način.
Seznam se prikaže s funkcijo print().
# print(os.environ)
Tako kot pri slovarju lahko uporabite naslednje metode ali pa s funkcijo in preverite obstoj ključev in vrednosti.
keys()
values()
Obdelava ključev in vrednosti je v osnovi enaka kot pri slovarjih. Primeri so navedeni spodaj.
Pridobite spremenljivke okolja.
os.environ[Environment variable name]
To vam bo omogočilo pridobitev vrednosti spremenljivke okolja, če pa določite ime spremenljivke okolja, ki ne obstaja, se bo pojavila napaka (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Za pridobitev privzete vrednosti, če ta ne obstaja, lahko uporabite metodo get() v os.environ. To je enako kot pri slovarju.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Na voljo je tudi funkcija os.getenv(). Tako kot metoda get() slovarja vrne privzeto vrednost, če ključ ne obstaja. Ta funkcija je uporabna, če želite samo pridobiti in preveriti vrednost spremenljivke okolja.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Nastavitev (add\overwrite) spremenljivk okolja
os.environ[Environment variable name]
Če ji dodelite vrednost, lahko nastavite spremenljivko okolja.
Če je navedeno novo ime spremenljivke okolja, je spremenljivka okolja na novo dodana, če pa je navedeno obstoječe ime spremenljivke okolja, je vrednost spremenljivke okolja prepisana.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Upoštevajte, da bo dodelitev česa drugega kot niza povzročila napako (TypeError). Če želite dodeliti številsko vrednost, jo določite kot niz.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Na voljo je tudi funkcija os.putenv(). Vendar se vrednost os.environ ne posodobi, ko jo nastavi funkcija os.putenv(). Zato je bolje določiti ključ (ime spremenljivke okolja) os.environ in dodeliti vrednost, kot je prikazano v zgornjem primeru.
Če je funkcija putenv() podprta, se dodelitev elementu v os.environ samodejno pretvori v ustrezen klic funkcije putenv(). V praksi je dodelitev elementu v os.environ prednostna operacija, saj neposredni klic na putenv() ne posodobi os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Kot smo že omenili, spremembe, ki jih naredimo z dodajanjem ali prepisovanjem okoljskih spremenljivk, veljajo samo znotraj programa Python. To ne pomeni, da bodo na novo zapisane tudi sistemske okoljske spremenljivke.
Upoštevajte, da lahko sprememba vrednosti povzroči uhajanje pomnilnika, odvisno od operacijskega sistema.
Opomba: Na nekaterih platformah, vključno s FreeBSD in Mac OS X, lahko spreminjanje vrednosti okolja povzroči uhajanje pomnilnika.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
To je posledica specifikacije putenv() samega operacijskega sistema.
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)
Odstranjevanje spremenljivk okolja
Če želite izbrisati okoljsko spremenljivko, uporabite metodo pop() v os.environ ali ukaz del. Enako kot pri slovarju.
V nadaljevanju je prikazan primer funkcije pop().
pop() vrne vrednost spremenljivke okolja, ki je bila izbrisana. Po privzetih nastavitvah bo navedba spremenljivke okolja, ki ne obstaja, povzročila napako (KeyError), navedba drugega argumenta pa bo vrnila vrednost spremenljivke okolja, če ta ne obstaja.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Sledi primer del.
Spremenljivka okolja se ponovno doda in nato izbriše. Če spremenljivka okolja ne obstaja, se prikaže napaka (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'
Na voljo je tudi funkcija os.unsetenv(). Vendar se, tako kot pri os.putenv(), vrednost os.environ ne posodobi, ko jo izbriše os.unsetenv(). Zato je bolje določiti ključ (ime spremenljivke okolja) os.environ in jo izbrisati, kot je prikazano v zgornjem primeru.
Če je funkcija unsetenv() podprta, se brisanje elementa v os.environ samodejno prevede v ustrezen klic funkcije unsetenv(). V praksi je izbris postavk v os.environ boljša operacija, saj neposredni klici na unsetenv() ne posodobijo os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Tudi brisanje okoljskih spremenljivk je učinkovito samo znotraj programa Python. Ne odstrani sistemskih okoljskih spremenljivk.
Učinek spreminjanja okoljskih spremenljivk
Kot sem že večkrat napisal, sprememba (nastavitev ali brisanje) okoljske spremenljivke os.environ ne spremeni sistemske okoljske spremenljivke, vpliva pa na podprocese, ki se zaženejo v programu.
Naslednja koda v sistemu Windows ne bo delovala po pričakovanjih, ker ni spremenljivke okolja LANG in ker je vsebina ukaza date drugačna.
Klicanje ukaza date v modulu podprocesa.
Izpisni rezultat ukaza date se spremeni glede na vrednost okoljske spremenljivke 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
#
Zaradi razlage smo spremenili okoljsko spremenljivko LANG v os.environ, vendar Python ponuja modul locale za nadzor lokalnega jezika.
Preklapljanje procesov s spremenljivkami okolja
Proces je mogoče preklopiti tudi glede na vrednost okoljske spremenljivke.
Tukaj je primer spreminjanja izpisa glede na spremenljivko okolja LANG v jezikovnih nastavitvah. Tu uporabljamo metodo startswith(), da ugotovimo, ali se niz začne z določenim nizom, če pa želite ugotoviti natančno ujemanje, lahko za primerjavo uporabite “==”.
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')
# こんにちは
Če so spremenljivke okolja nastavljene tako, da na primer označujejo razvojno in produkcijsko okolje, lahko pridobite vrednosti teh spremenljivk in preklopite postopek.