Travailler avec les variables d'environnement en Python

February 24, 2021
Rédigé par
Révisé par

Travailler avec les variables d'environnement en Python

Les variables d'environnement sont un excellent moyen de configurer votre application Python, éliminant ainsi la nécessité de modifier votre code source lorsque la configuration change. Souvent transmis à l'application par le biais de variables d'environnement, les éléments de configuration courants sont les clés API, ports réseau et serveurs de base de données tiers, ainsi que toutes les options personnalisées dont votre application peut avoir besoin pour fonctionner correctement.

Dans cet article, je vais vous présenter un certain nombre de techniques et d'outils disponibles dans Python pour travailler avec des variables d'environnement.

Comment accéder aux variables d'environnement à partir de Python ?

Utilisation du dictionnaire os.environ

Dans Python, le dictionnaire os.environ contient toutes les variables d'environnement. Le moyen le plus simple de récupérer une variable à partir de votre application est d'utiliser la syntaxe standard du dictionnaire. Par exemple, voici comment vous pouvez accéder à une variable d'environnement nommée USER (utilisateur) :

>>> import os
>>> user = os.environ['USER']
>>> user
'miguel'

En utilisant cette méthode, si vous tentez d'importer une variable d'environnement qui n'existe pas, Python génerera une exception KeyError :

>>> database_url = os.environ['DATABASE_URL']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/miguel/.pyenv/versions/3.8.6/lib/python3.8/os.py", line 675, in __getitem__
    raise KeyError(key) from None
KeyError: 'DATABASE_URL'

Utilisation de os.environ.get()

L'utilisation de KeyError (erreur de clé) est une bonne idée pour les variables d'environnement requises par votre programme, mais il existe des situations dans lesquelles vous pouvez vouloir rendre certaines variables facultatives. Pour éviter l'erreur, vous pouvez utiliser la méthode get() du dictionnaire, qui renvoie None (aucun) lorsque la clé demandée n'existe pas dans le dictionnaire :

>>> database_url = os.environ.get('DATABASE_URL')

Ajout d'une valeur par défaut si la variable n'est pas définie

Si vous souhaitez fournir une valeur par défaut pour la variable manquante qui n'est pas None, vous pouvez l'ajouter comme deuxième argument :

>>> database_url = os.environ.get('DATABASE_URL', 'sqlite:///')
>>> database_url
'sqlite:///'

Utilisation de la fonction os.getenv()

Python offre également la fonction os.getenv() pour accéder aux variables d'environnement. Son fonctionnement est très semblable à la méthode os.environ.get(). Voici comment l'utiliser pour accéder à une variable :

>>> user = os.getenv('USER')
>>> user
'miguel'

Cette fonction ne génère pas d'erreur pour les variables manquantes, elle renvoie None tout comme os.environ.get(). Elle accepte également un deuxième argument avec une valeur par défaut personnalisée :

>>> database_url = os.getenv('DATABASE_URL', 'sqlite://')
>>> database_url
'sqlite://'

os.getenv() est-elle meilleure qu'os.environ ? C'est à vous de voir. Personnellement, je préfère utiliser le dictionnaire os.environ, car j'ai ainsi la possibilité d'arrêter le programme avec KeyError si une variable requise est manquante.

Comment définir des variables d'environnement ?

Dans cette section, je vais vous expliquer brièvement la méthode pour définir les variables d'environnement dans une fenêtre de terminal ou d'invite de commande. Si vous souhaitez connaître toutes les façons possibles de définir les variables d'environnement, mon collègue Dominik Kundel a écrit un post très détaillé qui explique comment définir des variables d'environnement.

Unix et MacOS

Il existe deux méthodes de base pour définir une variable d'environnement à partir d'une session de terminal bash ou zsh. La première utilise le mot clé export (exportation) :

export DEBUG=true

Une variable définie de cette manière sera transmise à tous les programmes ou scripts que vous démarrez à partir de cette session de terminal. Gardez à l'esprit que les variables d'environnement ne sont enregistrées nulle part en dehors du contexte de la session shell. Elles seront donc conservées lorsque vous fermez la session de terminal.

La seconde consiste à définir la variable d'environnement sur la même ligne que celle sur laquelle l'application cible est exécutée :

DEBUG=true python my_cool_application.py

Ce deuxième formulaire présente un certain avantage : la variable n'est définie que dans l'espace d'environnement de l'application prévue.

Microsoft Windows

Si vous utilisez Windows, plusieurs options s'offrent à vous. Si vous souhaitez définir des variables d'environnement via le panneau de configuration, consultez cet article.

Si vous êtes dans une fenêtre d'invite de commande, vous pouvez définir une variable d'environnement à l'aide de la commande set (définir) :

set DEBUG=true

Comme dans le cas d'Unix, la variable n'est ni stockée ni mémorisée au-delà de la session en cours.

Si vous utilisez la nouvelle console PowerShell, la syntaxe de définition des variables d'environnement est complètement différente :

$Env:DEBUG = "true"

Enfin, si vous utilisez une couche de compatibilité Unix telle que WSL ou Cygwin, vous devez accéder à la section Unix de cet article et utiliser l'une des méthodes répertoriées pour bash ou zsh.

Utilisation des fichiers .env

Vous vous perdez entre toutes les différentes manières de définir des variables d'environnement ? Je trouve personnellement qu'il est peu pratique que chaque plateforme ou shell nécessite une procédure différente.

À mon avis, pour gérer au mieux vos variables d'environnement, il faut les stocker dans un fichier .env (prononcé dot env ou point env). Un fichier .env est un fichier texte dans lequel les variables sont définies ; une par ligne. Le format d'un fichier .env est exactement le même sous tous les systèmes d'exploitation. Ainsi, les fichiers .env uniformisent l'utilisation des variables d'environnement sur toutes les plateformes. Cerise sur le gâteau, en écrivant vos variables d'environnement dans un fichier importé automatiquement par Python, vous n'avez pas besoin de les définir manuellement chaque fois que vous démarrez un nouveau shell.

Voici un exemple de fichier .env court avec deux variables :

DEBUG=true
DATABASE_URL=sqlite:///mydb.sqlite

Vous pouvez créer un fichier .env dans le répertoire racine de chacun de vos projets. Vous pouvez ainsi vous assurer que toutes les variables nécessaires à chaque projet sont bien organisées !

Le package python-dotenv permet à une application Python d'importer des variables définies dans un fichier .env dans l'environnement. Vous pouvez installer python-dotenv dans votre environnement virtuel à l'aide de pip :

pip install python-dotenv

Vous pouvez voir ci-dessous comment importer un fichier .env dans une application Python :

>>> from dotenv import load_dotenv
>>> load_dotenv()

La fonction load_dotenv() recherche un fichier nommé .env dans le répertoire actuel et ajoute toutes les définitions de variables dans le dictionnaire os.environ. Si un fichier .env est introuvable dans le répertoire actuel, la recherche passe au répertoire parent. La recherche continue à remonter dans la hiérarchie des répertoires jusqu'à ce qu'un fichier .env soit trouvé ou que le répertoire de premier niveau soit atteint.

Si vous souhaitez empêcher python-dotenv de rechercher un fichier .env dans vos répertoires, vous pouvez transmettre un chemin explicite vers votre fichier comme argument pour load_dotenv() :

>>> from dotenv import load_dotenv
>>> load_dotenv('/home/miguel/my_project/.env')

Il existe d'autres arguments que vous pouvez utiliser lorsque vous appelez la fonction load_dotenv(). Si vous souhaitez en savoir plus, consultez la documentation.

Une fois le fichier .env importé, vous pouvez accéder aux variables d'environnement à l'aide de l'une des méthodes indiquées ci-dessus.

Remarque sur la sécurité des fichiers .env

Dans de nombreux cas, vous ajoutez des variables d'environnement contenant des informations sensibles à vos fichiers .env, comme des mots de passe ou des clés API. Pour cette raison, en général, vous ne souhaitez pas ajouter ces fichiers au répertoire de contrôle source de votre projet.

La pratique courante consiste à ajouter une exception pour les fichiers portant ce nom, afin qu'ils ne soient pas validés par erreur dans le contrôle de la source. Pour git, vous pouvez ajouter une ligne portant le nom du fichier au fichier .gitignore à la racine de votre répertoire.

Mais si vous ne pouvez pas valider le fichier .env, comment indiquez-vous aux utilisateurs du projet les variables à définir ? Pour cela, vous pouvez ajouter un exemple de fichier .env à votre répertoire avec un nom tel que .env.example, qui contient la liste des variables requises par le projet, mais sans inclure leurs valeurs. Il servira de guide aux utilisateurs de votre projet, sans donner d'informations sensibles.

Conclusion

J'espère que cet article vous a aidé à mieux comprendre comment utiliser les variables d'environnement pour configurer vos projets Python.

Vous connaissez d'autres façons de travailler avec les variables d'environnement ? J'adorerais les connaître !

Miguel Grinberg est développeur Python pour le contenu technique chez Twilio. Contactez-le à mgrinberg [at] twilio [dot] com si vous avez un projet Python que vous souhaitez partager sur ce blog !