A Python programokban a környezeti változókat az os.environ segítségével lehet lekérdezni, ellenőrizni, beállítani (hozzáadni vagy felülírni) és törölni. Vegye figyelembe, hogy a környezeti változók beállításával vagy törlésével végrehajtott változtatások csak a Python programon belül érvényesek. Ez nem jelenti azt, hogy a rendszerkörnyezeti változók átíródnak.
A következő információk itt találhatók.
os.environ
- Környezeti változók lekérdezése.
- Környezeti változók beállítása (add\overwrite)
- Környezeti változók eltávolítása
- A környezeti változók változásának hatása
- Folyamatok váltása környezeti változókkal
Importálja és használja az os modult. Mivel ez egy szabványos könyvtár, nincs szükség további telepítésre. A subprocess modul szintén a szabványos könyvtárban található.
import os
import subprocess
os.environ
Az os.environ típusa os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
Az os._Environ egy map típusú objektum egy kulcs-érték párossal, és ugyanazokkal a módszerekkel rendelkezik, mint egy szótár (dict típus). A környezeti változó neve a kulcs, értéke pedig az érték.
Az os.environ tartalma betöltődik az os modul importálásakor. Az os.environ tartalma akkor sem frissül, ha a program futása közben a rendszerkörnyezeti változók más módon módosulnak.
A listát a print() paranccsal jelenítjük meg.
# print(os.environ)
A szótárhoz hasonlóan használhatja a következő módszereket, vagy az in segítségével ellenőrizheti a kulcsok és értékek létezését.
keys()
values()
A kulcsok és értékek feldolgozása alapvetően ugyanaz, mint a szótárak esetében. Példák az alábbiakban találhatók.
Környezeti változók lekérdezése.
os.environ[Environment variable name]
Ez lehetővé teszi a környezeti változó értékének lekérdezését, de ha olyan környezeti változó nevét adja meg, amely nem létezik, hibaüzenetet kap (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Az os.environ get() metódusa használható az alapértelmezett érték lekérdezésére, ha az nem létezik. Ez is megegyezik a szótárral.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Az os.getenv() függvény is rendelkezésre áll. A szótár get() metódusához hasonlóan ez is az alapértelmezett értéket adja vissza, ha a kulcs nem létezik. Ez a függvény akkor hasznos, ha csak egy környezeti változó értékét szeretnénk lekérdezni és ellenőrizni.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Környezeti változók beállítása (add\overwrite)
os.environ[Environment variable name]
Ha ehhez értéket rendel, akkor beállíthat egy környezeti változót.
Új környezeti változó nevének megadásakor a környezeti változó újonnan kerül hozzáadásra, meglévő környezeti változó nevének megadásakor pedig a környezeti változó értéke felülírásra kerül.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Ne feledje, hogy a karakterlánctól eltérő értékek hozzárendelése hibát (TypeError) eredményez. Ha numerikus értéket szeretne hozzárendelni, adja meg stringként.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Az os.putenv() függvény is rendelkezésre áll. Az os.environ értéke azonban nem frissül, amikor azt az os.putenv() beállítja. Emiatt előnyösebb az os.environ kulcsát (környezeti változó nevét) megadni és az értéket hozzárendelni a fenti példában látható módon.
Ha a putenv() funkció támogatott, akkor az os.environ fájlban lévő elemhez való hozzárendelés automatikusan átalakul a putenv() megfelelő hívásává. A gyakorlatban az os.environ elemhez való hozzárendelés az előnyösebb művelet, mivel a putenv() közvetlen hívása nem frissíti az os.environ-t.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Mint korábban említettük, a környezeti változók hozzáadásával vagy felülírásával végrehajtott változtatások csak a Python programon belül érvényesek. Ez nem jelenti azt, hogy a rendszerkörnyezeti változók átíródnak.
Vegye figyelembe, hogy az érték megváltoztatása az operációs rendszertől függően memóriaszivárgást okozhat.
Megjegyzés: Egyes platformokon, beleértve a FreeBSD-t és a Mac OS X-et, az environ értékének megváltoztatása memóriaszivárgást okozhat.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Ez magának az operációs rendszernek a putenv() specifikációjának köszönhető.
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)
Környezeti változók eltávolítása
Egy környezeti változó törléséhez használja az os.environ pop() metódusát vagy a del utasítást. Ugyanaz, mint a szótár.
A következő egy példa a pop() parancsra.
A pop() a törölt környezeti változó értékét adja vissza. Alapértelmezés szerint egy nem létező környezeti változó megadása hibát (KeyError) eredményez, de a második argumentum megadása a környezeti változó értékét adja vissza, ha az nem létezik.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
A következő példa a del.
A környezeti változót újra hozzáadjuk, majd töröljük. Ha a környezeti változó nem létezik, hibaüzenet (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'
Az os.unsetenv() függvény is rendelkezésre áll. Az os.putenv() függvényhez hasonlóan azonban az os.environ értéke nem frissül, amikor az os.unsetenv() törli. Ezért célszerű megadni az os.environ kulcsát (környezeti változó nevét) és törölni azt a fenti példában bemutatott módon.
Ha az unsetenv() funkció támogatott, akkor az os.environ fájlban lévő elem törlése automatikusan az unsetenv() megfelelő hívását eredményezi. A gyakorlatban az os.environ-ban lévő elemek törlése az előnyösebb művelet, mivel az unsetenv() közvetlen hívása nem frissíti az os.environ-t.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
A környezeti változók törlése szintén csak az adott Python programon belül érvényes. A rendszerkörnyezeti változókat nem távolítja el.
A környezeti változók változásának hatása
Mint már többször írtam, az os.environ környezeti változó megváltoztatása (beállítása vagy törlése) nem változtatja meg a rendszer környezeti változóját, de hatással van a programban indított alfolyamatokra.
A következő kód nem fog a várt módon működni Windows alatt, mivel nincs LANG környezeti változó, és a date parancs tartalma is más.
A dátum parancs meghívása az alfolyamat modulban.
A date parancs kimeneti eredménye a LANG környezeti változó értékétől függően változik.
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
#
A magyarázat kedvéért a LANG környezeti változót megváltoztattuk az os.environ-ban, de a Python biztosít egy locale modult a nyelvi beállítások vezérlésére.
Folyamatok váltása környezeti változókkal
Lehetőség van arra is, hogy a folyamatot egy környezeti változó értéke alapján kapcsolja át.
Íme egy példa a kimenet megváltoztatására a LANG környezeti változónak megfelelően a nyelvi beállításokban. Itt a startswith() metódust használjuk annak megállapítására, hogy a karakterlánc kezdődik-e a megadott karakterlánccal, de ha a pontos egyezést akarjuk meghatározni, akkor az “==” kapcsolót használhatjuk az összehasonlításhoz.
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')
# こんにちは
Ezenkívül, ha például a környezeti változók úgy vannak beállítva, hogy jelzik a fejlesztői környezetet és a termelési környezetet, lekérdezheti ezeknek a változóknak az értékeit, és átkapcsolhatja a folyamatot.