Proměnné prostředí Pythonu a jak s nimi pracovat

Chcete lépe spravovat svou konfiguraci? Naučte se pracovat s proměnnými prostředí v Pythonu.

Když jsem se učil Python, stavěl jsem projekty, abych aplikoval to, co jsem se právě naučil. Podmnožina těch, které zahrnují připojení k databázi a dotazování se pomocí Pythonu. Což znamenalo, že jsem pro ověření potřeboval uložit konfiguraci databáze a citlivé informace, jako je uživatelské jméno a heslo.

Tvrdé kódování tak citlivých informací ve skriptu Python nebyl dobrý nápad. A naučil jsem se, jak používat konfigurační soubory a proměnné prostředí – spolu s vestavěnými moduly Pythonu pro práci s nimi.

Takže kdykoli potřebuji ve svých aplikacích použít citlivé informace, jako jsou hesla a klíče API, nastavím je jako proměnné prostředí a podle potřeby je načtu. V tomto tutoriálu vás provedu proměnnými prostředí a jak s nimi pracovat v Pythonu.

Co jsou proměnné prostředí?

Proměnné prostředí jsou proměnné mimo vaši aplikaci, které ukládají konfigurační informace, systémová nastavení a podobně. Obvykle jsou spravovány operačním systémem nebo prostředím aplikace. Mezi klíčové vlastnosti proměnných prostředí patří:

  • Páry název-hodnota: Proměnné prostředí se skládají z názvu (také známého jako klíč) a odpovídající hodnoty.
  • Rozsah systému: Proměnné prostředí můžete nastavit na úrovni systému a zpřístupnit je všem procesům běžícím v systému. V případě potřeby je také můžete upravit nebo definovat na úrovni aplikace, což ovlivní pouze danou konkrétní aplikaci.
  • Dynamické a proměnlivé: Během běhu můžete měnit proměnné prostředí, což poskytuje flexibilitu.

Jak jsou proměnné prostředí užitečné

Proměnné prostředí nabízejí několik výhod pro správu konfigurace a citlivých informací ve vašich aplikacích Python:

  • Oddělení starostí: Uložením konfigurace mimo váš kód udržíte starosti správy konfigurace oddělené od logiky vaší aplikace.
  • Zabezpečení: Citlivá data, jako jsou klíče API a přihlašovací údaje k databázi, můžete ukládat do proměnných prostředí – aniž byste je odhalili ve zdrojovém kódu – čímž se sníží riziko odhalení.
  • Flexibilita: S proměnnými prostředí je aktualizace konfiguračních nastavení jednoduchá, protože můžete aktualizovat/provádět změny mimo kódovou základnu. Proměnné prostředí umožňují upravit nastavení konfigurace bez úpravy kódu. Tato flexibilita je užitečná zejména při nasazování aplikací do různých prostředí nebo při aktualizaci přihlašovacích údajů.

V následujících částech tohoto kurzu prozkoumáme, jak nastavit, přistupovat a spravovat proměnné prostředí v Pythonu a jak vylepšují správu konfigurace ve vašich projektech.

Jak nastavit proměnné prostředí

Proměnné prostředí můžete nastavit pomocí příkazového řádku. Rozsah těchto proměnných prostředí se vztahuje pouze na aktuální relaci – a nepřetrvávají mimo aktuální relaci.

Pokud používáte počítač Mac nebo Linux, můžete v aktuální relaci terminálu nastavit proměnnou prostředí takto:

export MY_VARIABLE=my_value

Pokud jste uživatelem Windows, můžete dočasně nastavit proměnnou prostředí, jak je znázorněno:

set MY_VARIABLE=my_value

Přístup k proměnným prostředí v Pythonu

Python poskytuje os modul pro funkce související s operačním systémem. A os.environ je slovník proměnných prostředí. Názvy proměnných prostředí a jejich hodnoty jsou klíče a hodnoty slovníku, resp.

Takže můžete přistupovat k hodnotám proměnných prostředí – pomocí (jejich názvů jako) klíčů – stejným způsobem, jako byste přistupovali k prvkům slovníku.

Zde je několik příkladů:

import os
print(os.environ['HOME'])
# Output: /home/balapriya
print(os.environ['USER'])
# Output: balapriya

Zatím je vše dobré. Co se ale stane, když se pokusíte získat přístup k hodnotě proměnné prostředí, která nebyla nikdy nastavena?

Zkusme získat přístup k API_KEY, které jsme ještě nenastavili:

print(os.environ['API_KEY'])

Podle očekávání se zobrazí 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í klíčových chyb

KeyError můžete zpracovat takto:

import os

try:
	api_key = os.environ['API_KEY']
	print(f'API_KEY is set to: {api_key}')
except KeyError:
	print('API_KEY is not set. Please configure it.')

Tento přístup nezastaví náhle provádění programu, když je vyvolána výjimka KeyError. Poskytuje však popisnou chybovou zprávu:

# Output
API_KEY is not set. Please configure it.

Takže když se zbytek programu nespustí podle očekávání, víme, že jsme promeškali nastavení požadované proměnné 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 slovníkovou metodu get(). Místo chyby KeyError vrátí metoda get() hodnotu None, pokud proměnná není nalezena.

Přístup k proměnné NOT_SET, kterou jsme nenastavili, vrátí None:

print(os.environ.get('NOT_SET'))
# Output: None

Dávám přednost vyvolání chyby klíče, když není nastavena proměnná prostředí. Pak ji nechte projít bezobslužně nebo ji zahrňte do žádné, kterou metoda get() vrací.

Ale metoda get() je užitečná, když můžeme předat výchozí hodnotu pro konkrétní proměnnou prostředí, pokud není nastavena.

Zde je příklad:

print(os.environ.get('HOME','/home/user'))
# Output: /home/balapriya

Jak spravovat konfiguraci pomocí proměnných prostředí

Nyní si uveďme pár praktických příkladů, kdy v naší aplikaci používáme proměnné prostředí.

Příklad 1: Konfigurace parametrů připojení k databázi

Řekněme, že se chcete připojit k databázi PostgreSQL z Pythonu. Chcete-li tak učinit, můžete nainstalovat a používat konektor psycopg2:

pip install psycopg2

V tomto příkladu používáme proměnné prostředí ke konfiguraci parametrů připojení k databázi. Pokud proměnné prostředí nejsou nastaveny, poskytujeme výchozí hodnoty, které se mají použít.

import os
import psycopg2  

# Retrieve database configuration from environment variables
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')

# Establish a database connection
try:
	connection = psycopg2.connect(
    	host=db_host,
    	port=db_port,
    	user=db_user,
    	password=db_password,
    	database="mydb"
	)
	print('Connected to the database!')
except Exception as e:
	print(f'Error connecting to the database: {e}')

Příklad 2: Správa klíčů API

Vezměme si další příklad, který zahrnuje použití API klíčů.

Kromě rozhraní ChatGPT můžete pro podporu OpenAI LLM ve vašich aplikacích použít také OpenAI API.

Když si zaregistrujete účet OpenAI, (obvykle uvidíte) nějaké bezplatné časově omezené API kredity. Získejte svůj klíč API tak, že přejdete do Nastavení > Zobrazit klíče API.

K vytváření aplikací můžete použít Open AI Python SDK a framework jako LangChain. Chcete-li to provést, musíte nainstalovat knihovny (ve virtuálním prostředí) pomocí pip:

pip install openai
pip install langchain 

Zde je návod, jak můžete nastavit OPENAI_API_KEY jako proměnnou prostředí:

import os
os.environ["OPENAI_API_KEY"]='your-api-key'

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

Můžete klepnout na slovník os.environ z modulu os a upravit proměnné prostředí v rámci aktuálního procesu Pythonu:

import os

# Modify an existing environment variable or create a new one
os.environ['MY_VARIABLE'] = 'new_value'

V Pythonu můžete použít modul podprocesu k vytvoření podprocesů z existujícího skriptu Python. Což je užitečné, když chcete spouštět systémové programy v Pythonu.

V následujícím příkladu upravíme proměnnou prostředí PATH klepnutím do slovníku os.environ. Poté spustíme echo $PATH jako podproces:

import os
import subprocess

# Set a custom environment variable for the subprocess
os.environ['PATH'] = '/custom/path'

# Run a subprocess that accesses the PATH environment variable
result = subprocess.run("echo $PATH", shell=True, stdout=subprocess.PIPE)
output = result.stdout.decode()
print(output)
print(f'Subprocess output: {output}')

Vidíme, že PATH má hodnotu /custom/path:

# Output
/custom/path

Rozsah modifikovaných proměnných prostředí

Je důležité si uvědomit, že tyto aktualizace proměnných prostředí jsou dočasné a jsou platné pouze pro aktuální proces Pythonu. Jakmile skript skončí, změny se zahodí:

  • Aktuální proces Pythonu: Když upravíte proměnnou prostředí pomocí os.environ ve vašem skriptu Python, změna je lokální pro aktuální proces Pythonu. Neovlivní to další běžící procesy ani budoucí relace Pythonu.
  • Podřízené procesy: Změny proměnných prostředí provedené v rámci aktuálního procesu Pythonu jsou zděděny podřízenými procesy vytvořenými vaším skriptem. Pokud například vytvoříte podproces ze skriptu Python (nadřazený proces), podřízený proces bude mít přístup k upraveným proměnným prostředí (jak je vidět v příkladu).
  • Not System Wide: Proměnné prostředí nastavené v rámci skriptu Python nebudou přetrvávat mimo provádění tohoto skriptu.

Pokud potřebujete provést trvalé změny proměnných prostředí na systémové úrovni, obvykle to musíte provést pomocí metod specifických pro operační systém.

Jak načíst soubory .env pomocí python-dotenv

The knihovna python-dotenv je populární balíček Pythonu, který zjednodušuje proces načítání proměnných prostředí ze souboru .env do vašeho projektu Python. Je zvláště užitečné, když máte více prostředí (např. vývojové, produkční) s různými konfiguracemi a chcete tato nastavení ponechat odděleně od zdrojového kódu.

Instalace python-dotenv

Chcete-li používat python-dotenv, musíte 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 vytvořit soubor .env v kořenovém adresáři projektu a naplnit jej 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=your_api_key_here
DB_PASSWORD=your_database_password_here

Nyní můžete načíst proměnné prostředí ze souboru .env pomocí python-dotenv takto:

import os
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

# Access the environment variables
api_key = os.getenv("API_KEY")
database_password = os.getenv("DB_PASSWORD")

# Print out the env variables
print(f"API Key: {api_key}")
print(f"Database Password: {database_password}")

Všimněte si, že jsme použili os.getenv(NÁZEV PROMĚNNÉ) k 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 proměnným prostředí.

Zde je výstup:

API Key: your-api-key-here
Database Password: your-database-url-here

V tomto příkladu:

  • K načtení proměnných prostředí definovaných v souboru .env do aktuálního prostředí používáme load_dotenv().
  • Poté použijeme os.getenv() pro přístup k proměnným prostředí: API_KEY a DB_PASSWORD.

Závěr

A to je zábal! Doufám, že jste se naučili, jak spravovat konfiguraci a citlivé informace pomocí proměnných prostředí v aplikacích Pythonu. Probrali jsme základy nastavení a přístupu k proměnným prostředí a také jejich praktické použití při konfiguraci aplikací.

Zatímco proměnné prostředí jsou jistě užitečné při oddělování konfigurace od zdrojového kódu, měli byste citlivé proměnné ukládat jako tajemství v případech produkčního použití. Pro správu tajemství doporučuji prozkoumat nástroje jako HashiCorp Vault nebo Správce tajemství AWS.