Obtenir, ajouter, écraser et supprimer des variables d’environnement en Python (os.environ)

Affaires

Les variables d'environnement peuvent être récupérées, vérifiées, définies (ajout ou écrasement) et supprimées dans les programmes Python à l'aide de os.environ. Notez que les modifications apportées par la définition ou la suppression des variables d'environnement ne sont effectives que dans le programme Python. Cela ne signifie pas que les variables d'environnement du système seront réécrites.

Les informations suivantes sont fournies ici.

  • os.environ
  • Obtenir des variables d'environnement.
  • Définir (ajouter ou réécrire) des variables d'environnement
  • Supprimer les variables d'environnement
  • Effet de la modification des variables environnementales
  • Changement de processus par des variables d'environnement

Importez et utilisez le module os. Comme il s'agit d'une bibliothèque standard, aucune installation supplémentaire n'est nécessaire. Le module subprocess est également inclus dans la bibliothèque standard.

import os
import subprocess

os.environ

Le type de os.environ est os._Environ.

print(type(os.environ))
# <class 'os._Environ'>

os._Environ est un objet de type map avec une paire de clé et de valeur, et possède les mêmes méthodes qu'un dictionnaire (type dict). Le nom de la variable d'environnement est key, et sa valeur est value.

Le contenu de os.environ sera chargé lorsque le module os sera importé. Le contenu de os.environ ne sera pas mis à jour même si les variables d'environnement du système sont modifiées par d'autres moyens pendant l'exécution du programme.

La liste est affichée avec print().

# print(os.environ)

Comme pour le dictionnaire, vous pouvez utiliser les méthodes suivantes, ou utiliser in pour vérifier l'existence des clés et des valeurs.

  • keys()
  • values()

Le traitement des clés et des valeurs est fondamentalement le même que pour les dictionnaires. Des exemples sont donnés ci-dessous.

Obtenir des variables d'environnement.

os.environ[Environment variable name]
Cela vous permettra d'obtenir la valeur de la variable d'environnement, mais si vous spécifiez un nom de variable d'environnement qui n'existe pas, vous obtiendrez une erreur (KeyError).

print(os.environ['LANG'])
# ja_JP.UTF-8

# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'

La méthode get() de os.environ peut être utilisée pour obtenir la valeur par défaut si elle n'existe pas. C'est également la même chose que pour le dictionnaire.

print(os.environ.get('LANG'))
# ja_JP.UTF-8

print(os.environ.get('NEW_KEY'))
# None

print(os.environ.get('NEW_KEY', 'default'))
# default

La fonction os.getenv() est également fournie. Comme la méthode get() du dictionnaire, elle renvoie la valeur par défaut si la clé n'existe pas. Cette fonction est utile si vous souhaitez simplement obtenir et vérifier la valeur d'une variable d'environnement.

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(os.getenv('NEW_KEY'))
# None

print(os.getenv('NEW_KEY', 'default'))
# default

Définir (ajouter ou réécrire) des variables d'environnement

os.environ[Environment variable name]
En lui attribuant une valeur, vous pouvez définir une variable d'environnement.

Lorsqu'un nouveau nom de variable d'environnement est spécifié, la variable d'environnement est nouvellement ajoutée, et lorsqu'un nom de variable d'environnement existant est spécifié, la valeur de la variable d'environnement est écrasée.

os.environ['NEW_KEY'] = 'test'

print(os.environ['NEW_KEY'])
# test

os.environ['NEW_KEY'] = 'test2'

print(os.environ['NEW_KEY'])
# test2

Notez que toute affectation d'une valeur autre qu'une chaîne de caractères entraînera une erreur (TypeError). Si vous souhaitez attribuer une valeur numérique, spécifiez-la sous forme de chaîne de caractères.

# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int

os.environ['NEW_KEY'] = '100'

La fonction os.putenv() est également fournie. Cependant, la valeur de os.environ n'est pas mise à jour lorsqu'elle est définie par os.putenv(). Pour cette raison, il est préférable de spécifier la clé (nom de la variable d'environnement) de os.environ et d'assigner la valeur comme indiqué dans l'exemple ci-dessus.

Si putenv() est supporté, une affectation à un élément de os.environ sera automatiquement convertie en un appel correspondant à putenv(). En pratique, l'assignation à un élément de os.environ est l'opération préférée, puisqu'un appel direct à putenv() ne mettra pas à jour os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Comme indiqué précédemment, les modifications apportées par l'ajout ou l'écrasement de variables d'environnement ne sont effectives qu'au sein du programme Python. Cela ne signifie pas que les variables d'environnement du système seront réécrites.

Notez que la modification de la valeur peut provoquer une fuite de mémoire selon le système d'exploitation.

Remarque : Sur certaines plates-formes, notamment FreeBSD et Mac OS X, la modification de la valeur de environ peut provoquer une fuite de mémoire.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Ceci est dû à la spécification putenv() du système d'exploitation lui-même.

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)

Supprimer les variables d'environnement

Pour supprimer une variable d'environnement, utilisez la méthode pop() de os.environ ou l'instruction del. Comme pour le dictionnaire.

L'exemple suivant est un exemple de pop().

pop() renvoie la valeur de la variable d'environnement qui a été supprimée. Par défaut, la spécification d'une variable d'environnement qui n'existe pas entraînera une erreur (KeyError), mais la spécification du second argument renverra la valeur de la variable d'environnement si elle n'existe pas.

print(os.environ.pop('NEW_KEY'))
# 100

# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'

print(os.environ.pop('NEW_KEY', None))
# None

Voici un exemple de del.

La variable d'environnement est à nouveau ajoutée, puis supprimée. Si la variable d'environnement n'existe pas, une erreur (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'

La fonction os.unsetenv() est également fournie. Cependant, comme pour os.putenv(), la valeur de os.environ n'est pas mise à jour lorsqu'elle est supprimée par os.unsetenv(). Par conséquent, il est préférable de spécifier la clé (nom de la variable d'environnement) de os.environ et de la supprimer comme indiqué dans l'exemple ci-dessus.

Si unsetenv() est supporté, la suppression d'un élément dans os.environ se traduira automatiquement par l'appel correspondant à unsetenv(). En pratique, la suppression d'éléments dans os.environ est l'opération préférée, puisque les appels directs à unsetenv() ne mettront pas à jour os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

La suppression des variables d'environnement n'est également effective qu'au sein de ce programme Python. Elle ne supprime pas les variables d'environnement du système.

Effet de la modification des variables environnementales

Comme je l'ai écrit à plusieurs reprises, le fait de modifier (définir ou supprimer) la variable d'environnement os.environ ne modifie pas la variable d'environnement du système, mais il affecte les sous-processus qui sont lancés dans le programme.

Le code suivant ne fonctionnera pas comme prévu sous Windows car il n'y a pas de variable d'environnement LANG et le contenu de la commande date est différent.

Appel de la commande date dans le module sous-processus.

Le résultat de la commande date change en fonction de la valeur de la variable d'environnement 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
# 

Pour les besoins de l'explication, nous avons modifié la variable d'environnement LANG dans os.environ, mais Python fournit un module de locale pour contrôler la locale.

Changement de processus par des variables d'environnement

Il est également possible de faire basculer le processus en fonction de la valeur d'une variable d'environnement.

Voici un exemple de modification de la sortie en fonction de la variable d'environnement LANG dans les paramètres de langue. Ici, nous utilisons la méthode startswith() pour déterminer si la chaîne commence par la chaîne spécifiée, mais si vous voulez déterminer la correspondance exacte, vous pouvez utiliser “==” pour comparer.

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')
# こんにちは

En outre, si des variables d'environnement sont définies pour indiquer l'environnement de développement et l'environnement de production, par exemple, vous pouvez obtenir les valeurs de ces variables et basculer le processus.