Variabilele de mediu Python și cum să lucrați cu ele

Doriți să vă gestionați mai bine configurația? Aflați cum să lucrați cu variabilele de mediu în Python.

Când mă predam singur Python, construiam proiecte pentru a aplica ceea ce tocmai învățasem. Un subset al celor implicați conectarea la o bază de date și interogarea acesteia folosind Python. Ceea ce însemna că trebuia să stochez configurația bazei de date și informații sensibile, cum ar fi numele de utilizator și parola pentru autentificare.

Codarea greutății unor astfel de informații sensibile într-un script Python nu a fost o idee bună. Și am învățat cum să folosesc fișierele de configurare și variabilele de mediu, împreună cu modulele încorporate Python pentru a lucra cu ele.

Deci, ori de câte ori trebuie să folosesc informații sensibile, cum ar fi parole și chei API în aplicațiile mele, le setez ca variabile de mediu și le preiau după cum este necesar. În acest tutorial, vă voi ghida prin variabilele de mediu și cum să lucrați cu ele în Python.

Ce sunt variabilele de mediu?

Variabilele de mediu sunt variabile externe aplicației dvs. care stochează informații de configurare, setări de sistem și altele asemenea. Acestea sunt de obicei gestionate de sistemul de operare sau de mediul aplicației. Caracteristicile cheie ale variabilelor de mediu includ:

  • Perechi nume-valoare: variabilele de mediu constau dintr-un nume (cunoscut și ca cheie) și o valoare corespunzătoare.
  • Domeniul de aplicare al sistemului: Puteți seta variabile de mediu la nivel de sistem, făcându-le accesibile tuturor proceselor care rulează pe sistem. Dacă este necesar, le puteți modifica sau defini și la nivel de aplicație, afectând doar acea aplicație specifică.
  • Dinamic și mutabil: puteți modifica variabilele de mediu în timpul rulării, oferind flexibilitate.

Cum sunt utile variabilele de mediu

Variabilele de mediu oferă mai multe beneficii pentru gestionarea configurației și a informațiilor sensibile în aplicațiile dvs. Python:

  • Separarea preocupărilor: prin stocarea configurației în afara codului dvs., păstrați preocupările legate de gestionarea configurației separat de logica aplicației.
  • Securitate: puteți stoca date sensibile, cum ar fi cheile API și acreditările bazei de date, în variabile de mediu – fără a le expune în codul sursă – reducând riscul de expunere.
  • Flexibilitate: Cu variabilele de mediu, actualizarea setărilor de configurare este simplă, deoarece puteți actualiza/face modificări în afara bazei de cod. Variabilele de mediu vă permit să ajustați setările de configurare fără a modifica codul. Această flexibilitate este utilă în special pentru implementarea aplicațiilor în medii diferite sau la actualizarea acreditărilor.
  16 cel mai bun software de colectare a chiriei pentru proprietarii moderni

În următoarele secțiuni ale acestui tutorial, vom explora cum să setați, să accesați și să gestionați variabilele de mediu în Python și cum acestea îmbunătățesc gestionarea configurației în proiectele dvs.

Cum să setați variabilele de mediu

Puteți seta variabile de mediu folosind linia de comandă. Sfera de aplicare a unor astfel de variabile de mediu se aplică numai sesiunii curente și nu persistă în afara sesiunii curente.

Dacă sunteți pe o mașină Mac sau Linux, puteți seta o variabilă de mediu în sesiunea curentă a terminalului, astfel:

export MY_VARIABLE=my_value

Dacă sunteți un utilizator Windows, puteți seta temporar o variabilă de mediu, așa cum se arată:

set MY_VARIABLE=my_value

Accesați variabilele de mediu în Python

Python oferă modulul os pentru funcționalitatea legată de sistemul de operare. Și os.environ este un dicționar de variabile de mediu. Numele variabilelor de mediu și valorile acestora sunt cheile și, respectiv, valorile dicționarului.

Astfel, puteți accesa valorile variabilelor de mediu – folosind (numele lor ca) cheile – exact așa cum ați accesa elementele unui dicționar.

Iată câteva exemple:

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

Până acum, bine. Dar ce se întâmplă dacă încercați să accesați valoarea unei variabile de mediu care nu a fost setată niciodată?

Să încercăm să accesăm API_KEY pe care nu l-am setat încă:

print(os.environ['API_KEY'])

După cum era de așteptat, veți primi o KeyError:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<frozen os>", line 679, in __getitem__
KeyError: 'API_KEY'

Gestionarea erorilor cheie

Puteți gestiona KeyError așa cum se arată:

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.')

Această abordare nu oprește brusc execuția programului atunci când este ridicată o excepție KeyError. Totuși, oferă un mesaj de eroare descriptiv:

# Output
API_KEY is not set. Please configure it.

Deci, atunci când restul programului nu se execută așa cum era de așteptat, știm că am ratat setarea unei variabile de mediu necesare.

Accesarea variabilelor de mediu folosind metoda get().

Puteți folosi metoda dicționarului get() pentru a obține valoarea unei variabile de mediu. În loc de KeyError, metoda get() returnează None dacă variabila nu este găsită.

  Cele mai bune alternative GoPro pentru bugete limitate

Accesarea variabilei NOT_SET pe care nu am setat-o ​​returnează Nimic:

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

Prefer să ridic o eroare cheie atunci când variabila de mediu nu este setată. Apoi lăsați-o să treacă în tăcere sau să fie subsumată în None pe care o returnează metoda get().

Dar metoda get() este utilă atunci când putem trece o valoare implicită pentru o anumită variabilă de mediu dacă nu este setată.

Iată un exemplu:

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

Cum să gestionați configurația cu variabile de mediu

Acum să luăm câteva exemple practice în care folosim variabile de mediu în aplicația noastră.

Exemplul 1: Configurarea parametrilor conexiunii la baza de date

Să presupunem că doriți să vă conectați la o bază de date PostgreSQL din Python. Pentru a face acest lucru, puteți instala și utiliza conectorul psycopg2:

pip install psycopg2

În acest exemplu, folosim variabile de mediu pentru a configura parametrii conexiunii la baza de date. Dacă variabilele de mediu nu sunt setate, oferim valori implicite de utilizat.

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}')

Exemplul 2: Gestionarea cheilor API

Să luăm un alt exemplu care implică utilizarea cheilor API.

Pe lângă interfața ChatGPT, puteți utiliza și API-ul OpenAI pentru a sprijini OpenAI LLM în aplicațiile dvs.

Când vă înscrieți pentru un cont OpenAI, veți (de obicei să vedeți) niște credite API gratuite, limitate în timp. Luați-vă cheia API navigând la Setări > Vedeți cheile API.

Puteți utiliza SDK-ul Open AI Python și un cadru precum LangChain pentru a crea aplicații. Pentru a face acest lucru, trebuie să instalați bibliotecile (într-un mediu virtual) folosind pip:

pip install openai
pip install langchain 

Iată cum puteți seta OPENAI_API_KEY ca variabilă de mediu:

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

Acum puteți accesa Open AI LLM în scriptul dvs. astfel:

from langchain.llms import OpenAI
model=OpenAI(model_name="gpt-3.5-turbo")

Cum se modifică variabilele de mediu în Python

Puteți accesa dicționarul os.environ din modulul os pentru a modifica variabilele de mediu în cadrul procesului curent Python:

import os

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

În Python, puteți utiliza modul de subproces pentru a genera subprocese din scriptul Python existent. Ceea ce este util atunci când doriți să rulați programe de sistem în Python.

În exemplul următor, modificăm variabila de mediu PATH atingând dicționarul os.environ. Apoi rulăm echo $PATH ca subproces:

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}')

Vedem că PATH ia valoarea /custom/path:

# Output
/custom/path

Domeniul de aplicare al variabilelor de mediu modificate

Este important de reținut că aceste actualizări ale variabilelor de mediu sunt temporare și sunt valabile numai pentru procesul curent Python. Odată ce scriptul se termină, modificările sunt eliminate:

  • Procesul Python curent: Când modificați o variabilă de mediu folosind os.environ în cadrul scriptului dvs. Python, modificarea este locală procesului Python curent. Nu va afecta alte procese care rulează sau sesiunile viitoare Python.
  • Procese copil: modificările variabilelor de mediu făcute în cadrul procesului Python curent sunt moștenite de procesele copil create de scriptul dumneavoastră. De exemplu, dacă generați un subproces din scriptul dumneavoastră Python (procesul părinte), procesul copil va avea acces la variabilele de mediu modificate (după cum se vede în exemplu).
  • Nu la nivel de sistem: variabilele de mediu setate într-un script Python nu vor persista în afara execuției acelui script.
  Gestionați-vă finanțele afacerii cu contul de verificare Novo

Dacă trebuie să faceți modificări persistente la variabilele de mediu la nivel de sistem, de obicei trebuie să faceți acest lucru folosind metode specifice sistemului de operare.

Cum să încărcați fișiere .env cu python-dotenv

The biblioteca python-dotenv este un pachet popular Python care simplifică procesul de încărcare a variabilelor de mediu dintr-un fișier .env în proiectul dumneavoastră Python. Este deosebit de util atunci când aveți mai multe medii (de exemplu, dezvoltare, producție) cu configurații diferite și doriți să păstrați aceste setări separate de codul sursă.

Instalarea python-dotenv

Pentru a utiliza python-dotenv, trebuie să îl instalați mai întâi. Îl puteți instala — într-un mediu virtual — folosind pip, managerul de pachete Python:

pip install python-dotenv

Încărcarea variabilelor de mediu dintr-un fișier .env

Acum puteți crea un fișier .env în directorul rădăcină al proiectului și îl puteți popula cu perechi cheie-valoare, la fel ca variabilele de mediu obișnuite. Să creăm următorul fișier .env cu valori de substituent:

API_KEY=your_api_key_here
DB_PASSWORD=your_database_password_here

Acum puteți încărca variabilele de mediu din fișierul .env folosind python-dotenv astfel:

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}")

Observați că am folosit os.getenv(VARIABLE_NAME) pentru a obține valorile variabilelor de mediu. Aceasta este, de asemenea, o modalitate validă (și mai puțin utilizată) de a accesa variabilele de mediu.

Iată rezultatul:

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

În acest exemplu:

  • Folosim load_dotenv() pentru a încărca variabilele de mediu definite în fișierul .env în mediul curent.
  • Apoi folosim os.getenv() pentru a accesa variabilele de mediu: API_KEY și DB_PASSWORD.

Concluzie

Și ăsta e un înveliș! Sper că ați învățat cum să gestionați configurația și informațiile sensibile folosind variabilele de mediu în aplicațiile Python. Am acoperit elementele de bază ale setării și accesării variabilelor de mediu, precum și utilizarea lor practică în configurarea aplicațiilor.

În timp ce variabilele de mediu sunt cu siguranță utile în separarea configurației de codul sursă, ar trebui să stocați variabilele sensibile ca secrete în cazurile de utilizare de producție. Pentru gestionarea secretelor, vă recomand să explorați instrumente precum Seif HashiCorp sau Manager de secrete AWS.