Környezeti változók kinyerése, hozzáadása, felülírása és törlése Pythonban (os.environ)

Üzleti

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.

Copied title and URL