Keskkonnamuutujaid saab Pythoni programmides otsida, kontrollida, määrata (lisada või üle kirjutada) ja kustutada, kasutades os.environ. Pange tähele, et keskkonnamuutujate seadmise või kustutamise teel tehtud muudatused kehtivad ainult Pythoni programmis. See ei tähenda, et süsteemi keskkonnamuutujad kirjutatakse ümber.
Siin on esitatud järgmine teave.
os.environ
- Hangi keskkonnamuutujad.
- Määra (add\overwrite) keskkonnamuutujad
- Eemaldage keskkonnamuutujad
- Keskkonna muutujate muutmise mõju
- Protsesside vahetamine keskkonnamuutujate abil
Impordi ja kasuta os-moodulit. Kuna tegemist on standardse raamatukoguga, ei ole täiendavat paigaldamist vaja. Standardraamatukogus on ka subprocess-moodul.
import os
import subprocess
os.environ
Os.environ tüüp on os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ on map-tüüpi objekt, millel on võtme ja väärtuse paar ning millel on samad meetodid kui sõnaraamatul (dict-tüüpi). Keskkonnamuutuja nimi on key ja selle väärtus on value.
Os.environ sisu laaditakse, kui os-moodul imporditakse. Os.environ sisu ei uuendata isegi siis, kui süsteemi keskkonnamuutujaid muudetakse programmi töötamise ajal muul viisil.
Nimekiri kuvatakse funktsiooniga print().
# print(os.environ)
Nagu sõnastiku puhul, võite kasutada järgmisi meetodeid või kasutada võtmete ja väärtuste olemasolu kontrollimiseks in.
keys()
values()
Võtmete ja väärtuste töötlemine on põhimõtteliselt sama, mis sõnastike puhul. Näited on esitatud allpool.
Hangi keskkonnamuutujad.
os.environ[Environment variable name]
See võimaldab teil saada keskkonnamuutuja väärtuse, kuid kui määrate keskkonnamuutuja nime, mida ei ole olemas, saate vea (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Os.environ'i meetodit get() saab kasutada vaikeväärtuse saamiseks, kui seda ei ole olemas. See on ka sama, mis sõnastik.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Samuti on olemas funktsioon os.getenv(). Nagu sõnastiku meetod get(), tagastab see vaikeväärtuse, kui võtit ei ole olemas. See funktsioon on kasulik, kui soovite lihtsalt saada ja kontrollida keskkonnamuutuja väärtust.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Määra (add\overwrite) keskkonnamuutujad
os.environ[Environment variable name]
Määrates sellele väärtuse, saate määrata keskkonnamuutuja.
Uue keskkonnamuutuja nime määramisel lisatakse keskkonnamuutuja uuesti ja olemasoleva keskkonnamuutuja nime määramisel kirjutatakse keskkonnamuutuja väärtus üle.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Pange tähele, et millegi muu kui stringi määramine toob kaasa vea (TypeError). Kui soovite määrata numbrilist väärtust, määrake see stringina.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Samuti on olemas funktsioon os.putenv(). Siiski ei uuendata os.environ väärtust, kui see on seatud funktsiooniga os.putenv(). Seetõttu on parem määrata võtme (keskkonnamuutuja nimi) os.environ ja määrata väärtus, nagu on näidatud ülaltoodud näites.
Kui putenv() on toetatud, teisendatakse os.environ'i elemendi määramine automaatselt vastavaks kutseks putenv(). Praktikas on eelistatud operatsiooniks os.environ'i elemendi määramine, kuna otsene putenv() kõne ei uuenda os.environ'i.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Nagu varem mainitud, on keskkonnamuutujate lisamise või ülekirjutamise teel tehtud muudatused kehtivad ainult Pythoni programmi sees. See ei tähenda, et süsteemi keskkonnamuutujad kirjutatakse ümber.
Pange tähele, et väärtuse muutmine võib sõltuvalt operatsioonisüsteemist põhjustada mälulekke.
Märkus: Mõnel platvormil, sealhulgas FreeBSD ja Mac OS X, võib environ'i väärtuse muutmine põhjustada mälulekke.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
See tuleneb operatsioonisüsteemi enda putenv() spetsifikatsioonist.
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)
Eemaldage keskkonnamuutujad
Keskkonnamuutuja kustutamiseks kasutage os.environ meetodit pop() või käsku del. Sama nagu sõnastik.
Järgnevalt on toodud näide pop() funktsioonist.
pop() tagastab kustutatud keskkonnamuutuja väärtuse. Vaikimisi annab olematu keskkonnamuutuja määramine vea (KeyError), kuid teise argumendi määramine tagastab keskkonnamuutuja väärtuse, kui seda ei ole olemas.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Järgnevalt on toodud näide del.
Keskkonnamuutuja lisatakse uuesti ja seejärel kustutatakse. Kui keskkonnamuutuja ei eksisteeri, antakse viga (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'
Samuti on olemas funktsioon os.unsetenv(). Kuid nagu ka os.putenv() puhul, ei uuendata os.environ väärtust, kui see kustutatakse os.unsetenv() abil. Seetõttu on eelistatavam määrata võtme (keskkonnamuutuja nimi) os.environ ja kustutada see, nagu on näidatud ülaltoodud näites.
Kui unsetenv() on toetatud, tähendab os.environ'i elemendi kustutamine automaatselt vastavat unsetenv() üleskutset. Praktikas on eelistatud operatsiooniks elementide kustutamine failis os.environ, kuna otsekutsed unsetenv() ei uuenda faili os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Keskkonnamuutujate kustutamine toimib samuti ainult selles Pythoni programmis. See ei eemalda süsteemi keskkonnamuutujaid.
Keskkonna muutujate muutmise mõju
Nagu ma olen korduvalt kirjutanud, ei muuda keskkonnamuutuja os.environ muutmine (seadistamine või kustutamine) süsteemi keskkonnamuutujaid, kuid see mõjutab programmis käivitatavaid alamprotsesse.
Alljärgnev kood ei tööta Windowsis ootuspäraselt, sest seal puudub keskkonnamuutuja LANG ja kuupäevakäsu sisu on erinev.
Kuupäeva käsu kutsumine alamprotsessi moodulis.
Kuupäeva käsu väljundtulemus muutub sõltuvalt keskkonnamuutuja LANG väärtusest.
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
#
Selgituse huvides oleme muutnud keskkonnamuutuja LANG failis os.environ, kuid Python pakub locale-moodulit, et kontrollida locale'i.
Protsesside vahetamine keskkonnamuutujate abil
Samuti on võimalik protsessi lülitada vastavalt keskkonnamuutuja väärtusele.
Siin on näide väljundi muutmise kohta vastavalt keeleseadete keskkonnamuutujale LANG. Siin kasutame meetodit startswith(), et teha kindlaks, kas string algab määratud stringiga, kuid kui soovite määrata täpset kokkulangevust, võite kasutada võrdlemiseks “==”.
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')
# こんにちは
Lisaks, kui keskkonnamuutujad on seatud näiteks arenduskeskkonna ja tootmiskeskkonna näitamiseks, saate nende muutujate väärtused kätte ja protsessi ümber lülitada.