Máte zájem o efektivnější správu konfigurací? Osvojte si práci s proměnnými prostředí v Pythonu.
Když jsem začínal s Pythonem, vytvářel jsem různé projekty, abych si upevnil své nově nabyté znalosti. Část z nich zahrnovala komunikaci s databázemi a provádění dotazů pomocí Pythonu. Pro ověření přístupu jsem musel uložit citlivé údaje a konfigurační informace o databázi, jako je uživatelské jméno a heslo.
Pevné zakódování takto citlivých údajů přímo do Python skriptu se ukázalo jako nevhodné. Proto jsem se naučil využívat konfigurační soubory a proměnné prostředí, a to za pomoci vestavěných modulů Pythonu pro práci s nimi.
Nyní, kdykoliv potřebuji v aplikacích pracovat s citlivými informacemi, jako jsou hesla nebo API klíče, ukládám je jako proměnné prostředí a načítám je dle potřeby. V tomto tutoriálu vás seznámím s proměnnými prostředí a ukážu vám, jak s nimi pracovat v Pythonu.
Co jsou to proměnné prostředí?
Proměnné prostředí jsou proměnné, které existují mimo vaši aplikaci a ukládají konfigurační údaje, systémová nastavení a podobně. Obvykle jsou spravovány operačním systémem nebo prostředím, ve kterém aplikace běží. Mezi základní vlastnosti proměnných prostředí patří:
- Dvojice název-hodnota: Každá proměnná prostředí má svůj název (klíč) a přiřazenou hodnotu.
- Systémový rozsah: Proměnné prostředí mohou být nastaveny na úrovni operačního systému a tím pádem jsou dostupné pro všechny procesy běžící v systému. V případě potřeby je lze také definovat pro konkrétní aplikaci, a tak ovlivňují pouze ji.
- Dynamika a variabilita: Hodnoty proměnných prostředí lze za běhu měnit, což nabízí velkou flexibilitu.
Jak jsou proměnné prostředí užitečné?
Proměnné prostředí přinášejí několik výhod při správě konfigurací a citlivých údajů ve vašich Python aplikacích:
- Oddělení zájmů: Konfiguraci uloženou mimo kód oddělujeme od logiky aplikace.
- Zabezpečení: Citlivé informace, jako jsou API klíče nebo přihlašovací údaje k databázím, lze bezpečně uchovávat v proměnných prostředí, a tím zabránit jejich odhalení ve zdrojovém kódu, což snižuje riziko zneužití.
- Flexibilita: Nastavení konfigurace lze snadno aktualizovat, protože se změny provádí mimo zdrojový kód. Proměnné prostředí umožňují upravovat nastavení bez nutnosti zasahovat do kódu. Tato vlastnost se hodí zejména při nasazování aplikace do různých prostředí nebo při aktualizaci přístupových údajů.
V následujících částech tohoto tutoriálu si ukážeme, jak nastavovat, používat a spravovat proměnné prostředí v Pythonu, a jak přispívají k lepší správě konfigurace ve vašich projektech.
Jak nastavit proměnné prostředí?
Proměnné prostředí lze nastavit pomocí příkazového řádku. Platnost takto nastavených proměnných se vztahuje pouze na aktuální relaci a po jejím ukončení se neuchovají.
Pokud používáte počítač s macOS nebo Linux, můžete v aktuální relaci terminálu nastavit proměnnou prostředí takto:
export MY_VARIABLE=my_value
Uživatelé Windows mohou dočasně nastavit proměnnou prostředí takto:
set MY_VARIABLE=my_value
Přístup k proměnným prostředí v Pythonu
Python nabízí modul os
, který poskytuje funkce související s operačním systémem. os.environ
je slovník obsahující proměnné prostředí, kde názvy proměnných jsou klíče a jejich hodnoty jsou hodnotami slovníku.
K hodnotám proměnných prostředí se tedy můžete dostat pomocí jejich názvů (klíčů) stejně, jako když přistupujete k prvkům slovníku.
Zde je několik příkladů:
import os print(os.environ['HOME']) # Výstup: /home/balapriya
print(os.environ['USER']) # Výstup: balapriya
Zatím vše v pořádku. Co se ale stane, když se pokusíte přistoupit k hodnotě proměnné prostředí, která nebyla nikdy nastavena?
Zkusme získat přístup k API_KEY
, kterou jsme dosud nenastavili:
print(os.environ['API_KEY'])
Podle očekávání se objeví chyba KeyError
:
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<frozen os>", line 679, in __getitem__ KeyError: 'API_KEY'
Zpracování chyb KeyError
Chybu KeyError
lze ošetřit pomocí bloku try-except
:
import os try: api_key = os.environ['API_KEY'] print(f'API_KEY je nastaven na: {api_key}') except KeyError: print('API_KEY není nastaven. Prosím, konfigurujte ho.')
Tento přístup zajistí, že program nebude ukončen v případě, že nastane výjimka KeyError
. Místo toho se zobrazí srozumitelná chybová zpráva:
# Výstup API_KEY není nastaven. Prosím, konfigurujte ho.
Pokud tedy zbytek programu nefunguje, jak má, víme, že jsme zapomněli nastavit potřebnou proměnnou prostředí.
Přístup k proměnným prostředí pomocí metody get()
K získání hodnoty proměnné prostředí můžete použít také metodu get()
slovníku. Místo vyvolání chyby KeyError
vrátí metoda get()
hodnotu None
, pokud proměnná nebyla nalezena.
Pokud se pokusíme přistoupit k proměnné NOT_SET
, kterou jsme nenastavili, získáme None
:
print(os.environ.get('NOT_SET')) # Výstup: None
Osobně preferuji vyvolání chyby klíče v případě, že proměnná prostředí není nastavena. Nicméně, metoda get()
je užitečná, pokud chceme nastavit výchozí hodnotu pro případ, že konkrétní proměnná prostředí není definovaná.
Zde je příklad:
print(os.environ.get('HOME','/home/user')) # Výstup: /home/balapriya
Jak spravovat konfiguraci pomocí proměnných prostředí?
Nyní si ukážeme pár praktických příkladů, kdy proměnné prostředí využíváme v naší aplikaci.
Příklad 1: Konfigurace parametrů připojení k databázi
Předpokládejme, že se chcete připojit k databázi PostgreSQL pomocí Pythonu. K tomu můžete využít knihovnu psycopg2
:
pip install psycopg2
V tomto příkladu použijeme proměnné prostředí ke konfiguraci parametrů připojení k databázi. Pokud proměnné prostředí nejsou nastaveny, použijí se výchozí hodnoty.
import os import psycopg2 # Načtení konfigurace databáze z proměnných prostředí db_host = os.environ.get('DB_HOST', 'localhost') db_port = os.environ.get('DB_PORT', '5432') db_user = os.environ.get('DB_USER', 'myuser') db_password = os.environ.get('DB_PASSWORD', 'mypassword') # Vytvoření spojení s databází try: connection = psycopg2.connect( host=db_host, port=db_port, user=db_user, password=db_password, database="mydb" ) print('Připojeno k databázi!') except Exception as e: print(f'Chyba při připojování k databázi: {e}')
Příklad 2: Správa API klíčů
Podívejme se na další příklad, tentokrát s API klíči.
Kromě ChatGPT můžete pro podporu OpenAI LLM ve vašich aplikacích využít i OpenAI API.
Při registraci účtu OpenAI (obvykle získáte) nějaké bezplatné dočasné kredity na API. Svůj API klíč získáte v sekci Nastavení > Zobrazit API klíče.
Pro vývoj aplikací můžete využít Open AI Python SDK a framework, jako je LangChain. Nejprve si nainstalujte knihovny (ve virtuálním prostředí) pomocí pip:
pip install openai pip install langchain
Zde je příklad, jak nastavit OPENAI_API_KEY
jako proměnnou prostředí:
import os os.environ["OPENAI_API_KEY"]='vas-api-klic'
Nyní můžete přistupovat k Open AI LLM ve vašem skriptu takto:
from langchain.llms import OpenAI model=OpenAI(model_name="gpt-3.5-turbo")
Jak upravit proměnné prostředí v Pythonu?
Pro úpravu proměnných prostředí v rámci aktuálního Python procesu můžete využít slovník os.environ
z modulu os
:
import os # Úprava existující proměnné prostředí nebo vytvoření nové os.environ['MY_VARIABLE'] = 'nova_hodnota'
V Pythonu můžete k vytváření podprocesů z existujícího skriptu využít modul subprocess
. To je užitečné, když potřebujete spouštět systémové programy z Pythonu.
V následujícím příkladu upravíme proměnnou prostředí PATH
a následně spustíme echo $PATH
jako podproces:
import os import subprocess # Nastavení vlastní proměnné prostředí pro podproces os.environ['PATH'] = '/vlastni/cesta' # Spuštění podprocesu, který přistupuje k proměnné prostředí PATH result = subprocess.run("echo $PATH", shell=True, stdout=subprocess.PIPE) output = result.stdout.decode() print(output) print(f'Výstup podprocesu: {output}')
Můžeme vidět, že PATH
má hodnotu /vlastni/cesta
:
# Výstup /vlastni/cesta
Rozsah modifikovaných proměnných prostředí
Je důležité si uvědomit, že tyto změny proměnných prostředí jsou dočasné a platí pouze pro aktuální Python proces. Jakmile skript skončí, změny se zruší:
- Aktuální Python proces: Pokud upravíte proměnnou prostředí pomocí
os.environ
ve vašem skriptu, změna platí pouze lokálně pro tento proces. Neovlivní to žádné jiné běžící procesy ani budoucí relace Pythonu. - Podřízené procesy: Změny proměnných prostředí v aktuálním procesu se dědí do podřízených procesů vytvořených skriptem. Například pokud z Python skriptu (nadřazeného procesu) vytvoříte podproces, podřízený proces bude mít přístup k upraveným proměnným prostředí (viz příklad výše).
- Není systémově: Proměnné prostředí nastavené v Python skriptu nebudou trvalé mimo spuštění tohoto skriptu.
Pokud potřebujete provést trvalé změny proměnných prostředí na systémové úrovni, obvykle je nutné použít specifické metody daného operačního systému.
Jak načítat .env
soubory pomocí python-dotenv
?
Knihovna python-dotenv
je oblíbený Python balíček, který zjednodušuje proces načítání proměnných prostředí ze souboru .env
do vašeho projektu. Je to zvláště užitečné, pokud máte více prostředí (např. vývojové, produkční) s různými konfiguracemi a chcete tato nastavení uchovávat odděleně od zdrojového kódu.
Instalace python-dotenv
Pro používání python-dotenv
je nutné jej nejprve nainstalovat. Můžete jej nainstalovat – ve virtuálním prostředí – pomocí pip, správce balíčků Pythonu:
pip install python-dotenv
Načítání proměnných prostředí ze souboru .env
Nyní můžete v kořenovém adresáři projektu vytvořit soubor .env
a vyplnit ho páry klíč-hodnota, stejně jako běžné proměnné prostředí. Vytvořme následující soubor .env
se zástupnými hodnotami:
API_KEY=vas_api_klic_zde DB_PASSWORD=vase_heslo_k_databazi_zde
Nyní můžete načíst proměnné prostředí ze souboru .env
pomocí python-dotenv
takto:
import os from dotenv import load_dotenv # Načtení proměnných prostředí ze souboru .env load_dotenv() # Přístup k proměnným prostředí api_key = os.getenv("API_KEY") database_password = os.getenv("DB_PASSWORD") # Výpis proměnných prostředí print(f"API klíč: {api_key}") print(f"Heslo k databázi: {database_password}")
Všimněte si, že jsme použili os.getenv(NAZEV_PROMENNE)
pro získání hodnot proměnných prostředí. Toto je také platný (a méně běžně používaný) způsob přístupu k nim.
Zde je výstup:
API klíč: vas_api_klic_zde Heslo k databázi: vase_heslo_k_databazi_zde
V tomto příkladu:
load_dotenv()
se používá k načtení proměnných prostředí definovaných v souboru.env
do aktuálního prostředí.- Poté použijeme
os.getenv()
pro přístup k proměnným prostředí:API_KEY
aDB_PASSWORD
.
Závěr
A to je vše! Doufám, že jste pochopili, jak spravovat konfiguraci a citlivé informace pomocí proměnných prostředí v Python aplikacích. Prošli jsme si základy nastavení a přístupu k proměnným prostředí a také jejich praktické využití při konfiguraci aplikací.
I když jsou proměnné prostředí užitečné pro oddělení konfigurace od zdrojového kódu, měli byste citlivé proměnné ukládat jako tajné klíče v produkčním prostředí. Pro správu tajných klíčů doporučuji vyzkoušet nástroje jako HashiCorp Vault nebo AWS Secrets Manager.