Souhaitez-vous optimiser la gestion de votre configuration ? Découvrez comment exploiter les variables d’environnement dans vos projets Python.
Lors de mon apprentissage de Python, je développais des projets pour mettre en pratique mes nouvelles connaissances. Certains de ces projets impliquaient la connexion et l’interrogation de bases de données via Python. Cela nécessitait de stocker la configuration de la base de données ainsi que des informations sensibles, telles que les noms d’utilisateur et mots de passe pour l’authentification.
Intégrer directement ces informations sensibles dans un script Python s’avérait une mauvaise pratique. J’ai donc appris à utiliser les fichiers de configuration, les variables d’environnement et les modules intégrés de Python pour les manipuler.
Désormais, à chaque fois que j’ai besoin d’informations confidentielles telles que des mots de passe ou des clés API dans mes applications, je les définis en tant que variables d’environnement que je récupère ensuite selon les besoins. Ce guide a pour but de vous éclairer sur les variables d’environnement et leur utilisation avec Python.
Qu’est-ce que les variables d’environnement ?
Les variables d’environnement sont des variables externes à votre application, conçues pour stocker des informations de configuration, des paramètres système, et plus encore. Elles sont généralement gérées par le système d’exploitation ou l’environnement d’exécution de l’application. Voici les principales caractéristiques des variables d’environnement :
- Paires clé-valeur : les variables d’environnement sont composées d’un nom (ou clé) et d’une valeur associée.
- Portée système : il est possible de définir des variables d’environnement au niveau du système, les rendant ainsi accessibles à tous les processus exécutés sur ce système. Au besoin, vous pouvez les configurer au niveau de l’application, affectant uniquement cette application spécifique.
- Dynamique et modifiable : vous pouvez modifier les variables d’environnement pendant l’exécution de l’application, offrant ainsi une grande flexibilité.
Comment les variables d’environnement sont-elles utiles ?
L’utilisation de variables d’environnement offre de multiples avantages pour la gestion de la configuration et des informations sensibles dans vos applications Python :
- Séparation des responsabilités : en gardant la configuration en dehors de votre code, vous isolez la gestion de la configuration de la logique de votre application.
- Sécurité accrue : vous pouvez stocker des informations sensibles, telles que les clés API et les informations d’identification de base de données, dans des variables d’environnement, les protégeant ainsi des regards indiscrets dans le code source, ce qui réduit le risque d’exposition.
- Flexibilité : grâce aux variables d’environnement, la mise à jour des paramètres de configuration est simplifiée, car elle se fait en dehors du code. Les variables d’environnement permettent d’ajuster la configuration sans modifier le code lui-même. Cette flexibilité est particulièrement pratique lors du déploiement d’applications dans différents environnements ou pour la mise à jour des informations d’identification.
Dans les sections suivantes de ce guide, nous allons examiner comment définir, accéder et gérer les variables d’environnement en Python, et comment elles contribuent à améliorer la gestion de la configuration dans vos projets.
Comment configurer les variables d’environnement
Vous avez la possibilité de définir des variables d’environnement via la ligne de commande. Ces variables ne sont valables que pour la session en cours et ne persisteront pas au-delà.
Si vous utilisez un système Mac ou Linux, vous pouvez définir une variable d’environnement dans votre session de terminal actuelle de cette manière :
export MY_VARIABLE=my_value
Si vous utilisez Windows, vous pouvez définir temporairement une variable d’environnement comme ceci :
set MY_VARIABLE=my_value
Accéder aux variables d’environnement en Python
Python propose le module os pour interagir avec le système d’exploitation. La variable os.environ
est un dictionnaire contenant les variables d’environnement. Les noms des variables sont les clés du dictionnaire, et leurs valeurs sont les valeurs correspondantes.
Vous pouvez donc accéder aux valeurs des variables d’environnement en utilisant leurs noms comme clés, de la même manière que vous accédez à un élément dans un dictionnaire.
Voici quelques exemples :
import os print(os.environ['HOME']) # Output: /home/balapriya
print(os.environ['USER']) # Output: balapriya
Jusqu’à présent, tout va bien. Mais qu’arrive-t-il si vous essayez d’accéder à la valeur d’une variable d’environnement qui n’a jamais été définie ?
Tentons d’accéder à API_KEY, qui n’a pas été définie :
print(os.environ['API_KEY'])
Comme prévu, vous obtiendrez une KeyError :
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<frozen os>", line 679, in __getitem__ KeyError: 'API_KEY'
Gérer les erreurs de clé
Vous pouvez gérer KeyError de cette manière :
import os try: api_key = os.environ['API_KEY'] print(f'API_KEY is set to: {api_key}') except KeyError: print('API_KEY is not set. Please configure it.')
Cette méthode empêche l’arrêt brutal du programme lorsqu’une exception KeyError est levée. Elle affiche également un message d’erreur descriptif :
# Output API_KEY is not set. Please configure it.
Ainsi, si le reste du programme ne s’exécute pas comme prévu, nous savons qu’une variable d’environnement requise n’a pas été configurée.
Accéder aux variables d’environnement à l’aide de la méthode get()
La méthode get() du dictionnaire permet d’obtenir la valeur d’une variable d’environnement. Plutôt qu’une KeyError, elle retourne None si la variable est introuvable.
L’accès à la variable NOT_SET, que nous n’avons pas définie, retourne None :
print(os.environ.get('NOT_SET')) # Output: None
Je préfère déclencher une erreur de clé lorsqu’une variable d’environnement n’est pas définie, plutôt que d’ignorer l’absence de valeur ou d’utiliser la valeur None retournée par la méthode get().
Cependant, la méthode get() est utile pour définir une valeur par défaut pour une variable d’environnement donnée si elle n’est pas définie.
Voici un exemple :
print(os.environ.get('HOME','/home/user')) # Output: /home/balapriya
Comment gérer la configuration avec les variables d’environnement
Examinons des exemples concrets d’utilisation des variables d’environnement dans une application.
Exemple 1 : Configurer les paramètres de connexion à la base de données
Supposons que vous souhaitiez vous connecter à une base de données PostgreSQL depuis Python. Pour cela, vous pouvez installer et utiliser le connecteur psycopg2 :
pip install psycopg2
Dans cet exemple, nous utilisons les variables d’environnement pour définir les paramètres de connexion à la base de données. Si ces variables ne sont pas définies, nous utilisons des valeurs par défaut.
import os import psycopg2 # Retrieve database configuration from environment variables db_host = os.environ.get('DB_HOST', 'localhost') db_port = os.environ.get('DB_PORT', '5432') db_user = os.environ.get('DB_USER', 'myuser') db_password = os.environ.get('DB_PASSWORD', 'mypassword') # Establish a database connection try: connection = psycopg2.connect( host=db_host, port=db_port, user=db_user, password=db_password, database="mydb" ) print('Connected to the database!') except Exception as e: print(f'Error connecting to the database: {e}')
Exemple 2 : Gérer les clés API
Prenons un autre exemple avec des clés API.
Outre l’interface ChatGPT, vous pouvez aussi utiliser l’API OpenAI pour intégrer les LLM OpenAI dans vos applications.
Lors de votre inscription à OpenAI, vous recevez généralement des crédits API gratuits pour une durée limitée. Votre clé API est disponible dans Paramètres > Afficher les clés API.
Vous pouvez utiliser le SDK Python OpenAI et un framework comme LangChain pour créer des applications. Il est nécessaire d’installer les bibliothèques (dans un environnement virtuel) à l’aide de pip :
pip install openai pip install langchain
Voici comment définir la variable d’environnement OPENAI_API_KEY :
import os os.environ["OPENAI_API_KEY"]='your-api-key'
Vous pouvez désormais accéder aux LLM OpenAI dans votre script de cette manière :
from langchain.llms import OpenAI model=OpenAI(model_name="gpt-3.5-turbo")
Comment modifier les variables d’environnement en Python
Vous pouvez accéder au dictionnaire os.environ depuis le module os afin de modifier les variables d’environnement dans le processus Python actuel :
import os # Modify an existing environment variable or create a new one os.environ['MY_VARIABLE'] = 'new_value'
En Python, le module subprocess permet de créer des sous-processus à partir d’un script Python existant. Ceci s’avère pratique pour exécuter des commandes système en Python.
Dans l’exemple qui suit, nous modifions la variable d’environnement PATH en accédant au dictionnaire os.environ. Nous exécutons ensuite echo $PATH
en tant que sous-processus :
import os import subprocess # Set a custom environment variable for the subprocess os.environ['PATH'] = '/custom/path' # Run a subprocess that accesses the PATH environment variable result = subprocess.run("echo $PATH", shell=True, stdout=subprocess.PIPE) output = result.stdout.decode() print(output) print(f'Subprocess output: {output}')
On constate que PATH prend la valeur de /custom/path :
# Output /custom/path
Portée des variables d’environnement modifiées
Il est important de retenir que ces modifications de variables d’environnement sont temporaires et ne sont valables que pour le processus Python actuel. Une fois le script terminé, les changements sont perdus :
- Processus Python actuel : lorsque vous modifiez une variable d’environnement avec
os.environ
dans votre script Python, cette modification est limitée au processus Python actuel. Elle n’affecte pas les autres processus en cours ou les sessions Python à venir. - Processus enfants : les changements apportés aux variables d’environnement dans le processus Python actuel sont hérités par les processus enfants générés par votre script. Ainsi, si vous lancez un sous-processus depuis votre script Python (processus parent), ce processus enfant aura accès aux variables d’environnement modifiées (comme l’illustre l’exemple).
- Pas à l’échelle du système : les variables d’environnement définies dans un script Python ne seront pas conservées au-delà de l’exécution du script.
Pour effectuer des changements permanents aux variables d’environnement à l’échelle du système, il faut utiliser des méthodes spécifiques à votre système d’exploitation.
Comment charger les fichiers .env avec python-dotenv
La bibliothèque python-dotenv est un package Python populaire qui facilite le chargement des variables d’environnement depuis un fichier .env dans votre projet Python. Ceci est particulièrement utile lorsque vous travaillez avec plusieurs environnements (par exemple, développement, production) ayant des configurations différentes, et que vous voulez garder ces paramètres séparés de votre code source.
Installation de python-dotenv
Pour utiliser python-dotenv, vous devez d’abord l’installer. Vous pouvez l’installer (dans un environnement virtuel) à l’aide de pip, le gestionnaire de packages Python :
pip install python-dotenv
Chargement des variables d’environnement à partir d’un fichier .env
Vous pouvez maintenant créer un fichier .env à la racine de votre projet et le remplir avec des paires clé-valeur, comme pour les variables d’environnement classiques. Créons le fichier .env suivant avec des valeurs fictives :
API_KEY=your_api_key_here DB_PASSWORD=your_database_password_here
Vous pouvez maintenant charger les variables d’environnement du fichier .env en utilisant python-dotenv comme ceci :
import os from dotenv import load_dotenv # Load environment variables from .env file load_dotenv() # Access the environment variables api_key = os.getenv("API_KEY") database_password = os.getenv("DB_PASSWORD") # Print out the env variables print(f"API Key: {api_key}") print(f"Database Password: {database_password}")
Notez que nous avons utilisé os.getenv(VARIABLE_NAME)
pour obtenir les valeurs des variables d’environnement. C’est également une méthode valide (bien que moins courante) pour accéder aux variables d’environnement.
Voici le résultat :
API Key: your-api-key-here Database Password: your-database-url-here
Dans cet exemple :
- Nous utilisons
load_dotenv()
pour charger les variables d’environnement définies dans le fichier .env dans l’environnement actuel. - Nous utilisons ensuite
os.getenv()
pour accéder aux variables d’environnement : API_KEY et DB_PASSWORD.
Conclusion
Voilà, c’est tout ! J’espère que vous avez appris à gérer la configuration et les informations sensibles à l’aide de variables d’environnement dans les applications Python. Nous avons abordé les bases de la définition et de l’accès aux variables d’environnement, ainsi que leur utilisation pratique dans la configuration des applications.
Bien que les variables d’environnement soient très utiles pour séparer la configuration du code source, il est préférable de stocker les variables sensibles comme des secrets dans les cas d’utilisation en production. Pour gérer les secrets, je recommande d’explorer des outils tels que HashiCorp Vault ou AWS Secrets Manager.