Come accedere alle variabili dell'ambiente in Python

Aliaksei Yursha 18 luglio 2021
  1. Cosa sono le variabili d’ambiente
  2. Variabili d’ambiente in Python
  3. Leggere le variabili ambientali in Python
  4. Aggiungere variabili d’ambiente in Python
Come accedere alle variabili dell'ambiente in Python

Cosa sono le variabili d’ambiente

Le variabili di ambiente sono variabili a cui vengono assegnati valori esterni al programma Python. Gli sviluppatori di solito le impostano sulla riga di comando prima di invocare l’eseguibile Python. Il sistema operativo rende quindi queste variabili accessibili ad un programma Python dall’interno.

Le variabili di ambiente esistono per la flessibilità del programma. In questo modo, un utente può cambiare parametri specifici prima dell’esecuzione del programma, e
il programma sarà in grado di esaminare questi parametri e di modificare il suo comportamento in modo dinamico.

Non è richiesta alcuna modifica del codice, e tale uso delle variabili ambientali è chiamato configurazione del programma.

Variabili d’ambiente in Python

Il meccanismo di impostazione delle variabili ambientali dipende dalla piattaforma. Per questo motivo, sono reso disponibile attraverso il modulo os integrato in Python, che astrae
funzionalità dipendente dal sistema operativo.

Python runtime mantiene tutte le variabili d’ambiente del programma in un dizionario-come oggetto os.environ.

Si noti che l’oggetto os.environ è popolato quando il runtime di Python carica il modulo os. Se si prova a cambiare le variabili d’ambiente dopo il fatto (ad esempio, esportando una nuova variabile d’ambiente nell’emulatore di terminale), non funzionerà.

Leggere le variabili ambientali in Python

L’accesso alle variabili d’ambiente in Python viene effettuato eseguendo un’operazione di tipo dizionario operazioni sull’oggetto os.environ.

>>> import os
>>> os.environ
environ({'HOME': '/Users/john', 'LANG': 'en_US.UTF-8', 'LOGNAME': 'john', 'OLDPWD': '/Users/john', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'PWD': '/Users/john/python-tutorial', 'SHELL': '/bin/zsh', 'TERM': 'screen', 'TERM_PROGRAM': 'Apple_Terminal', 'TERM_PROGRAM_VERSION': '433', 'TERM_SESSION_ID': 'CDC91EF3-15D6-41AD-A17B-E959D97BC4B5', 'TMPDIR': '/var/folders/md/31nwv67j113d19z0_1287f1r0000gn/T/', 'TMUX': '/private/tmp/tmux-501/default,3319,0', 'TMUX_PANE': '%28' , 'USER': 'john', '_': '/usr/local/bin/python3', '__PYVENV_LAUNCHER__': '/usr/local/bin/python3'})
>>> os.environ['HOME']
'/Users/john'
>>> os.environ['LANG']
'en_US.UTF-8'

Se si accede ad una variabile d’ambiente usando un pedice [] notazione, e quella variabile non è definita, si otterrà un errore di runtime.

>>> os.environ['I_DONT_EXIST']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'I_DONT_EXIST'

Per evitare questo problema, si può leggere dall’oggetto os.environ utilizzando l’interfaccia get(). Se una variabile d’ambiente ricercata non è stata definita, get() restituisce None.

>>> result = os.environ.get('I_DONT_EXIST')
>>> print(result)
None

Una caratteristica di convenienza dell’interfaccia get() è che si può specificare un valore predefinito da usare nel caso in cui non esista una variabile di ambiente ricercata.

>>> os.environ.get('I_DONT_EXIST', 'I_AM_DEFAULT')
'I AM DEFAULT'

Un’alternativa a os.environ.get() è usare la funzione os.getenv(). Entrambe le funzioni funzionano allo stesso modo, e si può trattare quest’ultima come una API di convenienza.

Aggiungere variabili d’ambiente in Python

A volte è necessario modificare o aggiungere una variabile d’ambiente all’interno del programma. Ad esempio, può accadere che si debba modificare il comportamento della propria applicazione al ricevimento di una richiesta di configurazione di rete. Si cambiano le variabili d’ambiente usando l’operatore [] os.environ come se os.environ fosse un dizionario standard.

>>> import os
>>> os.environ['LANG']
'en_US.UTF-8'
>>> os.environ['LANG'] = 'en_GB.UTF-8'
>>> os.environ['LANG']
'en_GB.UTF-8'

Si noti che i valori delle variabili d’ambiente dovrebbero essere di tipo stringa. Se si cerca di assegnare un numero intero o qualsiasi altro valore non stringa ad una variabile d’ambiente, si deve otterrà un errore di esecuzione.

>>> import os
>>> os.environ['LANG'] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 684, in __setitem__
    value = self.encodevalue(value)
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 754, in encode
    raise TypeError("str expected, not %s" % type(value).__name__)
TypeError: str expected, not int