Premenné prostredia možno v programoch Python načítať, kontrolovať, nastavovať (pridávať alebo prepisovať) a odstraňovať pomocou súboru os.environ. Všimnite si, že zmeny vykonané nastavením alebo vymazaním premenných prostredia sú účinné len v rámci programu Python. Neznamená to, že sa prepíšu systémové premenné prostredia.
Tu sú uvedené tieto informácie.
os.environ
- Získajte premenné prostredia.
- Nastavenie (add\overwrite) premenných prostredia
- Odstránenie premenných prostredia
- Vplyv zmeny premenných prostredia
- Prepínanie procesov pomocou premenných prostredia
Importovať a používať modul os. Keďže ide o štandardnú knižnicu, nie je potrebná žiadna ďalšia inštalácia. Modul subproces je tiež súčasťou štandardnej knižnice.
import os
import subprocess
os.environ
Typ os.environ je os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ je objekt typu mapa s dvojicou kľúč a hodnota a má rovnaké metódy ako slovník (typ dict). Názov premennej prostredia je kľúč a jej hodnota je value.
Obsah súboru os.environ sa načíta pri importe modulu os. Obsah súboru os.environ sa neaktualizuje ani v prípade, že sa počas behu programu zmenia systémové premenné prostredia iným spôsobom.
Zoznam sa zobrazí pomocou funkcie print().
# print(os.environ)
Rovnako ako v prípade slovníka môžete použiť nasledujúce metódy alebo použiť in na kontrolu existencie kľúčov a hodnôt.
keys()
values()
Spracovanie kľúčov a hodnôt je v podstate rovnaké ako pri slovníkoch. Príklady sú uvedené nižšie.
Získajte premenné prostredia.
os.environ[Environment variable name]
To vám umožní získať hodnotu premennej prostredia, ale ak zadáte názov premennej prostredia, ktorá neexistuje, zobrazí sa chyba (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Metódu get() súboru os.environ možno použiť na získanie predvolenej hodnoty, ak neexistuje. Táto metóda je tiež rovnaká ako slovník.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
K dispozícii je aj funkcia os.getenv(). Podobne ako metóda get() slovníka vracia predvolenú hodnotu, ak kľúč neexistuje. Táto funkcia je užitočná, ak chcete len získať a skontrolovať hodnotu premennej prostredia.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Nastavenie (add\overwrite) premenných prostredia
os.environ[Environment variable name]
Priradením hodnoty tejto premennej môžete nastaviť premennú prostredia.
Ak je zadaný nový názov premennej prostredia, premenná prostredia je novo pridaná, a ak je zadaný existujúci názov premennej prostredia, hodnota premennej prostredia je prepísaná.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Všimnite si, že priradenie inej hodnoty ako reťazca bude mať za následok chybu (TypeError). Ak chcete priradiť číselnú hodnotu, zadajte ju ako reťazec.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
K dispozícii je aj funkcia os.putenv(). Hodnota os.environ sa však neaktualizuje, keď je nastavená funkciou os.putenv(). Z tohto dôvodu je vhodnejšie zadať kľúč (názov premennej prostredia) os.environ a priradiť jej hodnotu, ako je uvedené v príklade vyššie.
Ak je funkcia putenv() podporovaná, priradenie k položke v os.environ sa automaticky prevedie na zodpovedajúce volanie funkcie putenv(). V praxi sa uprednostňuje priradenie k položke v os.environ, pretože priame volanie funkcie putenv() neaktualizuje os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Ako už bolo spomenuté, zmeny vykonané pridaním alebo prepísaním premenných prostredia sú účinné len v rámci programu Python. Neznamená to, že sa prepíšu systémové premenné prostredia.
Upozorňujeme, že zmena hodnoty môže v závislosti od operačného systému spôsobiť únik pamäte.
Poznámka: Na niektorých platformách vrátane FreeBSD a Mac OS X môže zmena hodnoty environ spôsobiť únik pamäte.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Je to spôsobené špecifikáciou funkcie putenv() samotného operačného systému.
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)
Odstránenie premenných prostredia
Ak chcete odstrániť premennú prostredia, použite metódu pop() príkazu os.environ alebo príkaz del. Rovnako ako slovník.
Nasleduje príklad funkcie pop().
funkcia pop() vráti hodnotu premennej prostredia, ktorá bola odstránená. V predvolenom nastavení uvedenie neexistujúcej premennej prostredia spôsobí chybu (KeyError), ale uvedenie druhého argumentu vráti hodnotu premennej prostredia, ak neexistuje.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Nasleduje príklad del.
Premenná prostredia sa opäť pridá a potom sa odstráni. Ak premenná prostredia neexistuje, zobrazí sa chyba (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'
K dispozícii je aj funkcia os.unsetenv(). Podobne ako pri funkcii os.putenv() sa však hodnota os.environ neaktualizuje, keď je odstránená funkciou os.unsetenv(). Preto je vhodnejšie zadať kľúč (názov premennej prostredia) os.environ a odstrániť ju, ako je uvedené v príklade vyššie.
Ak je funkcia unsetenv() podporovaná, vymazanie položky v os.environ sa automaticky prevedie na príslušné volanie funkcie unsetenv(). V praxi sa uprednostňuje vymazanie položiek v os.environ, pretože priame volanie funkcie unsetenv() neaktualizuje os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Odstránenie premenných prostredia je tiež účinné len v rámci daného programu Python. Neodstráni systémové premenné prostredia.
Vplyv zmeny premenných prostredia
Ako som už opakovane napísal, zmena (nastavenie alebo vymazanie) premennej prostredia os.environ nemení systémovú premennú prostredia, ale ovplyvňuje podprocesy, ktoré sa spúšťajú v programe.
Nasledujúci kód nebude v systéme Windows fungovať podľa očakávania, pretože neexistuje premenná prostredia LANG a obsah príkazu date je iný.
Volanie príkazu date v module podprocesu.
Výstupný výsledok príkazu date sa mení v závislosti od hodnoty premennej prostredia 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
#
Na vysvetlenie uvádzame, že sme zmenili premennú prostredia LANG v súbore os.environ, ale Python poskytuje modul locale na ovládanie locale.
Prepínanie procesov pomocou premenných prostredia
Proces je možné prepínať aj podľa hodnoty premennej prostredia.
Tu je príklad zmeny výstupu podľa premennej prostredia LANG v nastaveniach jazyka. Tu používame metódu startswith() na určenie, či reťazec začína zadaným reťazcom, ale ak chcete určiť presnú zhodu, môžete na porovnanie použiť „==“.
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')
# こんにちは
Okrem toho, ak sú nastavené premenné prostredia, ktoré označujú napríklad vývojové prostredie a produkčné prostredie, môžete získať hodnoty týchto premenných a prepnúť proces.