Corso
Le variabili d'ambiente sono un potente meccanismo per memorizzare in modo flessibile e sicuro i dettagli di configurazione del tuo progetto di sviluppo. Conservano coppie chiave-valore di dati accessibili da linguaggi di programmazione come Python e tengono queste informazioni al riparo da occhi indiscreti. In questo tutorial imparerai i concetti e le tecniche fondamentali per creare e gestire variabili d'ambiente in Python.
Cosa sono le variabili d'ambiente?
Le variabili d'ambiente sono coppie nome-valore memorizzate in un luogo sicuro del tuo sistema operativo. Più spesso, appaiono così:
API_KEY=1akn4nka-aqwej3
In Python puoi usare queste variabili per conservare informazioni sensibili relative al tuo progetto di sviluppo. Le informazioni sensibili possono essere:
- Chiavi API per accedere ad applicazioni di terzi
- Username e password per accedere ad applicazioni tramite script
- Credenziali del database
- qualsiasi cosa che potrebbe causare problemi di sicurezza se esposta accidentalmente.
Per esempio, se scrivi uno script Python che usa apertamente le tue credenziali AWS e committi per sbaglio quello script su GitHub, c'è la possibilità che soggetti malevoli lo scoprano e facciano aumentare sensibilmente la tua bolletta AWS (capita davvero).
Un altro vantaggio delle variabili d'ambiente è la configurabilità. Puoi modificare facilmente le impostazioni (URL del database, percorsi dei file) cambiando le variabili d'ambiente senza toccare il codice. Questa caratteristica è particolarmente utile se usi la stessa impostazione in più parti del tuo progetto.
Quindi, vediamo come lavorarci in Python.
Come recuperare le variabili d'ambiente con il modulo os di Python
Per recuperare le variabili d'ambiente già presenti nel tuo sistema, puoi usare il modulo os. Dispone della funzione .getenv per ottenere le variabili:
import os
os.getenv("USER")
'bexgboost'
Qui sopra, sto recuperando il nome utente di sistema, che è presente in tutti i sistemi. Ce ne sono molti altri, come il percorso della home:
os.getenv("HOME")
'/home/bexgboost'
Oppure il percorso dell'eseguibile di Conda:
os.getenv("CONDA_EXE")
'/home/bexgboost/anaconda3/bin/conda'
Quindi, quando lanci i comandi conda, è così che il tuo terminale sa quale applicazione eseguire.
Ma cosa succede se provi a recuperare una variabile che non esiste:
os.getenv("MYDATABASE")
La funzione .getenv() non restituisce nulla, ma possiamo cambiare questo comportamento. Puoi usare il parametro default per restituire un valore personalizzato se una variabile non esiste:
os.getenv("COMPUTER_PASSWORD", default="Nope!")
'Nope!'
La funzione .getenv() è il metodo migliore per recuperare le variabili esistenti.
Tuttavia, in altre fonti potresti vedere metodi diversi come l'attributo .environ, che restituisce un dizionario contenente tutte le variabili d'ambiente:
current_directory = os.environ.get("PWD", None)
current_directory
'/home/bexgboost/articles/2024/4_april'
Essendo un dizionario, puoi usare la notazione con le parentesi (sconsigliata) o la funzione .get() per recuperare un valore.
os ha anche accesso forse alla variabile di sistema più importante chiamata PATH. PATH contiene i percorsi assoluti di tutti gli eseguibili installati sul tuo sistema, quindi è piuttosto lunga:
os.getenv("PATH")[:46]
'/home/bexgboost/.local/bin:/home/bexgboost/bin'
Ogni percorso in PATH è separato da due punti. Contiamo la lunghezza di PATH sul mio sistema:
def count_path_items():
items = os.getenv("PATH").split(":")
return len(items)
count_path_items()
79
79! Niente male.
Usare la libreria python-dotenv per gestire efficacemente le variabili d'ambiente in Python
Impostare variabili d'ambiente personalizzate
Ora che sappiamo come estrarre le variabili esistenti, vediamo come impostarne di personalizzate. Il primo metodo consiste nell'usare il dizionario os.environ:
# Create a new environment variable
os.environ["NEW_VARIABLE"] = "42" # Always expects a string value
os.getenv("NEW_VARIABLE")
'42'
Tuttavia, questo metodo non è molto utile perché tutte le nuove variabili andranno perse alla fine della sessione corrente.
Per fortuna, esiste un metodo più duraturo per memorizzare le variabili d'ambiente usando i file .env (si pronuncia dot-env). Questi file hanno la stessa sintassi, il che significa che funzionano su qualsiasi sistema operativo. Ecco come appare un file .env di esempio:
CUSTOM_API_LINK=https://myapi.com/v1/api
SNOWFLAKE_USERNAME=bexgboost
MYSQL_DATABASE_PASSWORD=as3ndf03
Per ora definisce solo tre variabili. Per leggere questo file ed estrarne il contenuto, useremo una libreria chiamata python-dotenv:
$ pip install python-dotenv
Poi, in uno script Python o in un Jupyter Notebook importeremo la funzione load_dotenv e la chiameremo:
from dotenv import load_dotenv
load_dotenv()
True
Se non riesce a trovare un file .env nella directory corrente, cercherà in tutte le directory genitore e restituirà True se lo trova.
Ho salvato il file .env qui sopra nella mia home ~/.env; ecco perché load_dotenv è riuscito a trovarlo.
Per creare i tuoi file, puoi usare il comando touch nel terminale oppure un editor di testo come VSCode:
$ touch ~/.env
La sintassi dei file .env è piuttosto flessibile. Per esempio, puoi impostare variabili con valori su più righe (devono avere le virgolette):
LONG_ENV="This is an environment
variable with a long message"
Usare i caratteri di escape:
LONG_ENV="This value uses an \"escape character"
Puoi anche aggiungere commenti al file per riferimento futuro:
# You can also add comments anywhere with a hashtag
CUSTOM_API_LINK=https://myapi.com/v1/api
SNOWFLAKE_USERNAME=bexgboost
MYSQL_DATABASE_PASSWORD=as3ndf03
È anche possibile usare il valore di una variabile all'interno di un'altra usando la sintassi ${VAR_NAME}:
FIRST_NAME=John
LAST_NAME=Doe
FULL_NAME="I am ${FIRST_NAME} ${LAST_NAME}"
Recuperare variabili d'ambiente personalizzate con python-dotenv
Recuperare variabili personalizzate è come prima: usa semplicemente il modulo os:
import os
os.getenv("CUSTOM_API_LINK")
'https://myapi.com/v1/api'
os.getenv("SNOWFLAKE_USERNAME")
'bexgboost'
Assicurati di chiamare prima load_dotenv.
Se il tuo file .env si trova in un percorso che load_dotenv non riesce a raggiungere, puoi passargli un percorso diretto come sotto:
load_dotenv("/home/bexgboost/somewhere/unreachable/.env")
True
Lavorare con i file .env in Jupyter
Una volta installato Python-dotenv, non devi importarlo in Python se usi Jupyter. La libreria include una magic di Jupyter che lo carica automaticamente:
# Run this anywhere in the notebook to load EVs from .env
%load_ext dotenv
%dotenv
Poi puoi usare di nuovo il modulo os:
import os
os.getenv("SNOWFLAKE_USERNAME")
'bexgboost'
Best practice per l'uso delle variabili d'ambiente in Python
In questa sezione elenchiamo alcune best practice per garantire che le variabili d'ambiente restino sicure e pienamente utilizzabili.
1. Aggiungi sempre i file .env a .gitignore per non committarli per errore su GitHub.
# Create .gitignore if it doesn't exist
$ touch .gitignore
$ echo ".env" >> .gitignore
2. Quando definisci le variabili usa nomi descrittivi, tutti in MAIUSCOLO.
# Good
DEBUG=True
LOGGING_VERBOSITY=3
# Bad
debug=True
LV=3
3. Crea un unico file .env per conservare le variabili di sistema che ti servono in ogni progetto.
$ touch ~/.env
4. Controlla l'ambito dei tuoi file .env. Crea file separati per le diverse parti del tuo workflow di sviluppo, come sotto:
$ touch development/.env.development
$ touch testing/.env.testing
$ touch production/.env.production
La funzione load_dotenv li riconoscerà.
Se crei più file .env con nomi diversi, modifica il file .gitignore in modo che siano tutti esclusi dall'indicizzazione di git:
# Pay attention to the asterisk *
$ echo ".env*" >> .gitignore
Conclusione
In questo articolo abbiamo visto tutti i concetti e le tecniche essenziali per gestire in modo efficace le variabili d'ambiente in Python. Abbiamo scoperto come recuperare le variabili esistenti con il modulo OS di Python e come creare valori personalizzati con la libreria python-dotenv. Abbiamo anche imparato a scrivere file .env in linea con le best practice.
Se vuoi approfondire l'ingegneria del software in Python, dai un'occhiata al nostro corso Software Engineering Principles in Python.
Puoi anche dare un'occhiata al nostro Python Programming Skill Track, che ti porterà da principiante a Pythonista avanzato con esercizi e progetti pratici.
Sono un creator di contenuti sulla data science con oltre 2 anni di esperienza e uno dei più seguiti su Medium. Mi piace scrivere articoli dettagliati su AI e ML con un pizzico di sarcasmo, perché bisogna pur fare qualcosa per renderli un po’ meno noiosi. Ho pubblicato oltre 130 articoli e un corso su DataCamp, con un altro in arrivo. I miei contenuti sono stati visti da oltre 5 milioni di persone, 20.000 delle quali sono diventate follower sia su Medium che su LinkedIn.


