Získávání, přidávání, přepisování a mazání proměnných prostředí v jazyce Python (os.environ)

Podnikání

Proměnné prostředí lze v programech Pythonu načítat, kontrolovat, nastavovat (přidávat nebo přepisovat) a mazat pomocí souboru os.environ. Všimněte si, že změny provedené nastavením nebo odstraněním proměnných prostředí jsou účinné pouze v rámci programu Python. Neznamená to, že se systémové proměnné prostředí přepíší.

Zde jsou uvedeny následující informace.

  • os.environ
  • Získat proměnné prostředí.
  • Nastavení (add\overwrite) proměnných prostředí
  • Odstranění proměnných prostředí
  • Vliv změny proměnných prostředí
  • Přepínání procesů pomocí proměnných prostředí

Import a použití modulu os. Jelikož se jedná o standardní knihovnu, není nutná žádná další instalace. Modul subproces je rovněž součástí standardní knihovny.

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 dvojicí klíč a hodnota a má stejné metody jako slovník (typ dict). Jméno proměnné prostředí je klíč a její hodnota je value.

Obsah souboru os.environ se načte při importu modulu os. Obsah souboru os.environ se neaktualizuje ani v případě, že se systémové proměnné prostředí během běhu programu změní jiným způsobem.

Seznam se zobrazí pomocí print().

# print(os.environ)

Stejně jako u slovníku můžete použít následující metody nebo pomocí in zkontrolovat existenci klíčů a hodnot.

  • keys()
  • values()

Zpracování klíčů a hodnot je v podstatě stejné jako u slovníků. Příklady jsou uvedeny níže.

Získat proměnné prostředí.

os.environ[Environment variable name]
To vám umožní získat hodnotu proměnné prostředí, ale pokud zadáte název proměnné prostředí, která neexistuje, zobrazí se chyba (KeyError).

print(os.environ['LANG'])
# ja_JP.UTF-8

# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'

Metodu get() souboru os.environ lze použít k získání výchozí hodnoty, pokud neexistuje. To je také stejné jako u slovníku.

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 dispozici je také funkce os.getenv(). Stejně jako metoda get() slovníku vrací výchozí hodnotu, pokud klíč neexistuje. Tato funkce je užitečná, pokud chcete pouze získat a zkontrolovat hodnotu proměnné prostředí.

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(os.getenv('NEW_KEY'))
# None

print(os.getenv('NEW_KEY', 'default'))
# default

Nastavení (add\overwrite) proměnných prostředí

os.environ[Environment variable name]
Přiřazením hodnoty této proměnné můžete nastavit proměnnou prostředí.

Pokud je zadán nový název proměnné prostředí, je proměnná prostředí nově přidána, a pokud je zadán název existující proměnné prostředí, je hodnota proměnné prostředí přepsána.

os.environ['NEW_KEY'] = 'test'

print(os.environ['NEW_KEY'])
# test

os.environ['NEW_KEY'] = 'test2'

print(os.environ['NEW_KEY'])
# test2

Všimněte si, že přiřazení čehokoli jiného než řetězce povede k chybě (TypeError). Pokud chcete přiřadit číselnou hodnotu, zadejte ji jako řetězec.

# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int

os.environ['NEW_KEY'] = '100'

K dispozici je také funkce os.putenv(). Hodnota os.environ se však neaktualizuje, když je nastavena funkcí os.putenv(). Z tohoto důvodu je vhodnější zadat klíč (název proměnné prostředí) os.environ a přiřadit hodnotu, jak je uvedeno v příkladu výše.

Pokud je podporována funkce putenv(), bude přiřazení k položce v souboru os.environ automaticky převedeno na odpovídající volání funkce putenv(). V praxi se dává přednost přiřazení položce v os.environ, protože přímé volání putenv() neaktualizuje os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Jak již bylo zmíněno, změny provedené přidáním nebo přepsáním proměnných prostředí jsou účinné pouze v rámci programu Python. Neznamená to, že by se přepisovaly systémové proměnné prostředí.

Všimněte si, že změna hodnoty může v závislosti na operačním systému způsobit únik paměti.

Poznámka: Na některých platformách, včetně FreeBSD a Mac OS X, může změna hodnoty environ způsobit únik paměti.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

To je způsobeno specifikací funkce 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)

Odstranění proměnných prostředí

Chcete-li odstranit proměnnou prostředí, použijte metodu pop() souboru os.environ nebo příkaz del. Stejně jako u slovníku.

Následuje příklad funkce pop().

pop() vrátí hodnotu proměnné prostředí, která byla odstraněna. Zadání neexistující proměnné prostředí má ve výchozím nastavení za následek chybu (KeyError), ale zadání druhého argumentu vrátí hodnotu proměnné prostředí, pokud 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

Následuje příklad del.

Proměnná prostředí je znovu přidána a poté odstraněna. Pokud proměnná prostředí neexistuje, zobrazí se 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 dispozici je také funkce os.unsetenv(). Stejně jako v případě funkce os.putenv() se však hodnota os.environ po smazání funkcí os.unsetenv() neaktualizuje. Proto je vhodnější zadat klíč (název proměnné prostředí) os.environ a odstranit ji, jak je uvedeno v příkladu výše.

Pokud je funkce unsetenv() podporována, bude odstranění položky v souboru os.environ automaticky převedeno na odpovídající volání funkce unsetenv(). V praxi je preferovanou operací mazání položek v os.environ, protože přímé volání unsetenv() neaktualizuje os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Odstranění proměnných prostředí je rovněž účinné pouze v rámci daného programu Python. Neodstraní systémové proměnné prostředí.

Vliv změny proměnných prostředí

Jak jsem již opakovaně psal, změna (nastavení nebo odstranění) proměnné prostředí os.environ nemění systémovou proměnnou prostředí, ale ovlivňuje podprocesy, které jsou v programu spouštěny.

Následující kód nebude v systému Windows fungovat podle očekávání, protože neexistuje proměnná prostředí LANG a obsah příkazu date je jiný.

Volání příkazu date v modulu podprocesu.

Výstupní výsledek příkazu date se mění v závislosti na hodnotě proměnné prostředí 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
# 

Pro vysvětlení uvádíme, že jsme změnili proměnnou prostředí LANG v souboru os.environ, ale Python poskytuje modul locale pro ovládání locale.

Přepínání procesů pomocí proměnných prostředí

Je také možné přepínat proces podle hodnoty proměnné prostředí.

Zde je příklad změny výstupu podle proměnné prostředí LANG v nastavení jazyka. Zde používáme metodu startswith() k určení, zda řetězec začíná zadaným řetězcem, ale pokud chcete určit přesnou shodu, můžete k porovnání použít „==“.

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')
# こんにちは

Pokud jsou navíc nastaveny proměnné prostředí, které označují například vývojové a produkční prostředí, můžete získat hodnoty těchto proměnných a proces přepnout.