Le variabili d'ambiente possono essere recuperate, controllate, impostate (aggiunte o sovrascritte) e cancellate nei programmi Python usando os.environ. Notate che i cambiamenti fatti impostando o cancellando le variabili d'ambiente hanno effetto solo all'interno del programma Python. Non significa che le variabili d'ambiente del sistema saranno riscritte.
Le seguenti informazioni sono fornite qui.
os.environ
- Ottenere le variabili d'ambiente.
- Imposta le variabili d'ambiente (aggiungi-scrivi)
- Rimuovere le variabili d'ambiente
- Effetto del cambiamento delle variabili ambientali
- Commutazione di processi tramite variabili d'ambiente
Importa e usa il modulo os. Poiché è una libreria standard, non è richiesta alcuna installazione aggiuntiva. Anche il modulo subprocess è incluso nella libreria standard.
import os
import subprocess
os.environ
Il tipo di os.environ è os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ è un oggetto di tipo mappa con una coppia di chiave e valore, e ha gli stessi metodi di un dizionario (tipo dict). Il nome della variabile d'ambiente è key, e il suo valore è value.
Il contenuto di os.environ viene caricato quando viene importato il modulo os. Il contenuto di os.environ non verrà aggiornato anche se le variabili d'ambiente del sistema vengono cambiate con altri mezzi mentre il programma è in esecuzione.
L'elenco viene visualizzato con print().
# print(os.environ)
Come per il dizionario, potete usare i seguenti metodi, o usare in per controllare l'esistenza di chiavi e valori.
keys()
values()
Il trattamento delle chiavi e dei valori è fondamentalmente lo stesso che per i dizionari. Gli esempi sono dati qui sotto.
Ottenere le variabili d'ambiente.
os.environ[Environment variable name]
Questo vi permetterà di ottenere il valore della variabile d'ambiente, ma se specificate un nome di variabile d'ambiente che non esiste, otterrete un errore (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Il metodo get() di os.environ può essere usato per ottenere il valore predefinito se non esiste. Questo è anche lo stesso del dizionario.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Viene anche fornita la funzione os.getenv(). Come il metodo get() del dizionario, restituisce il valore predefinito se la chiave non esiste. Questa funzione è utile se si vuole solo ottenere e controllare il valore di una variabile d'ambiente.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Imposta le variabili d'ambiente (aggiungi-scrivi)
os.environ[Environment variable name]
Assegnando un valore a questo, potete impostare una variabile d'ambiente.
Quando viene specificato un nuovo nome di variabile d'ambiente, la variabile d'ambiente viene aggiunta di nuovo, e quando viene specificato il nome di una variabile d'ambiente esistente, il valore della variabile d'ambiente viene sovrascritto.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Notate che assegnare qualcosa di diverso da una stringa risulterà in un errore (TypeError). Se volete assegnare un valore numerico, specificatelo come una stringa.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Viene anche fornita la funzione os.putenv(). Tuttavia, il valore di os.environ non viene aggiornato quando viene impostato da os.putenv(). Per questo motivo, è preferibile specificare la chiave (nome della variabile d'ambiente) di os.environ e assegnare il valore come mostrato nell'esempio sopra.
Se putenv() è supportato, un'assegnazione a un elemento in os.environ sarà automaticamente convertita in una chiamata corrispondente a putenv(). In pratica, l'assegnazione ad un elemento in os.environ è l'operazione preferita, poiché una chiamata diretta a putenv() non aggiornerà os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Come detto prima, i cambiamenti fatti aggiungendo o sovrascrivendo le variabili d'ambiente hanno effetto solo all'interno del programma Python. Non significa che le variabili d'ambiente del sistema saranno riscritte.
Notate che cambiare il valore può causare una perdita di memoria a seconda del sistema operativo.
Nota: su alcune piattaforme, incluse FreeBSD e Mac OS X, cambiare il valore di environ può causare una perdita di memoria.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Questo è dovuto alla specifica putenv() del sistema operativo stesso.
Successive calls to setenv() or putenv() assigning a differently sized value to the same name will result in a memory leak. The FreeBSD seman-tics semantics for these functions (namely, that the contents of value are copied and that old values remain accessible indefinitely) make this bug unavoidable.
Mac OS X Manual Page For putenv(3)
Rimuovere le variabili d'ambiente
Per cancellare una variabile d'ambiente, usate il metodo pop() di os.environ o la dichiarazione del. Come per il dizionario.
Quello che segue è un esempio di pop().
pop() restituisce il valore della variabile d'ambiente che è stata cancellata. Per impostazione predefinita, specificando una variabile d'ambiente che non esiste si otterrà un errore (KeyError), ma specificando il secondo argomento verrà restituito il valore della variabile d'ambiente se non esiste.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Quello che segue è un esempio di del.
La variabile d'ambiente viene aggiunta di nuovo e poi cancellata. Se la variabile d'ambiente non esiste, un errore (KeyError).
os.environ['NEW_KEY'] = '100'
print(os.getenv('NEW_KEY'))
# 100
del os.environ['NEW_KEY']
print(os.getenv('NEW_KEY'))
# None
# del os.environ['NEW_KEY']
# KeyError: 'NEW_KEY'
Viene anche fornita la funzione os.unsetenv(). Tuttavia, come per os.putenv(), il valore di os.environ non viene aggiornato quando viene cancellato da os.unsetenv(). Pertanto, è preferibile specificare la chiave (nome della variabile d'ambiente) di os.environ e cancellarla come mostrato nell'esempio sopra.
Se unsetenv() è supportato, la cancellazione di un elemento in os.environ si tradurrà automaticamente nella corrispondente chiamata a unsetenv(). In pratica, cancellare elementi in os.environ è l'operazione preferita, poiché le chiamate dirette a unsetenv() non aggiorneranno os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
La cancellazione delle variabili d'ambiente è efficace solo all'interno di quel programma Python. Non rimuove le variabili d'ambiente del sistema.
Effetto del cambiamento delle variabili ambientali
Come ho scritto più volte, cambiare (impostare o cancellare) la variabile d'ambiente os.environ non cambia la variabile d'ambiente del sistema, ma influenza i sottoprocessi che vengono lanciati nel programma.
Il seguente codice non funzionerà come previsto su Windows perché non c'è una variabile d'ambiente LANG e il contenuto del comando date è diverso.
Chiamare il comando date nel modulo subprocesso.
Il risultato del comando date cambia a seconda del valore della variabile d'ambiente LANG.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(subprocess.check_output('date', encoding='utf-8'))
# 2018年 7月12日 木曜日 20時54分13秒 JST
#
os.environ['LANG'] = 'en_US'
print(subprocess.check_output('date', encoding='utf-8'))
# Thu Jul 12 20:54:13 JST 2018
#
Per amore della spiegazione, abbiamo cambiato la variabile d'ambiente LANG in os.environ, ma Python fornisce un modulo locale per controllare il locale.
Commutazione di processi tramite variabili d'ambiente
È anche possibile cambiare il processo in base al valore di una variabile d'ambiente.
Ecco un esempio di cambiamento dell'output in base alla variabile d'ambiente LANG nelle impostazioni della lingua. Qui stiamo usando il metodo startswith() per determinare se la stringa inizia con la stringa specificata, ma se volete determinare la corrispondenza esatta, potete usare “==” per confrontare.
print(os.getenv('LANG'))
# en_US
if os.getenv('LANG').startswith('ja'):
print('こんにちは')
else:
print('Hello')
# Hello
os.environ['LANG'] = 'ja_JP'
if os.getenv('LANG').startswith('ja'):
print('こんにちは')
else:
print('Hello')
# こんにちは
Inoltre, se le variabili d'ambiente sono impostate per indicare l'ambiente di sviluppo e l'ambiente di produzione, per esempio, è possibile ottenere i valori di queste variabili e cambiare il processo.