Vous voulez mieux gérer votre configuration ? Apprenez à utiliser les variables d’environnement en Python.

Lorsque j’apprenais Python, je construisais des projets pour appliquer ce que je venais d’apprendre. Un sous-ensemble de ces projets consistait à se connecter à une base de données et à l’interroger à l’aide de Python. Cela signifie que je devais stocker la configuration de la base de données et des informations sensibles telles que le nom d’utilisateur et le mot de passe pour l’authentification.

Coder en dur de telles informations sensibles dans un script Python n’était pas une bonne idée. J’ai appris à utiliser les fichiers de configuration et les variables d’environnement, ainsi que les modules intégrés de Python.

Ainsi, chaque fois que j’ai besoin d’utiliser des informations sensibles telles que des mots de passe et des clés d’API dans mes applications, je les définis en tant que variables d’environnement et je les récupère en cas de besoin. Dans ce tutoriel, je vais vous présenter les variables d’environnement et la manière de les utiliser en Python.

Que sont les variables d’environnement ?

Les variables d’environnement sont des variables externes à votre application qui stockent des informations de configuration, des paramètres système, etc. Elles sont généralement gérées par le système d’exploitation ou l’environnement de l’application. Les principales caractéristiques des variables d’environnement sont les suivantes

  • Paires nom-valeur: Les variables d’environnement sont constituées d’un nom (également appelé clé) et d’une valeur correspondante.
  • Portée du système: Vous pouvez définir des variables d’environnement au niveau du système, ce qui les rend accessibles à tous les processus s’exécutant sur le système. Si nécessaire, vous pouvez également les modifier ou les définir au niveau de l’application, ce qui n’affecte que cette application spécifique.
  • Dynamique et mutable: Vous pouvez modifier les variables d’environnement au cours de l’exécution, ce qui offre une grande souplesse.

Utilité des variables d’environnement

Les variables d’environnement présentent plusieurs avantages pour la gestion de la configuration et des informations sensibles dans vos applications Python :

  • Séparation des préoccupations: En stockant la configuration en dehors de votre code, vous séparez les préoccupations liées à la gestion de la configuration de la logique de votre application.
  • Sécurité: Vous pouvez stocker des données sensibles, telles que des clés d’API et des identifiants de base de données, dans des variables d’environnement, sans les exposer dans le code source, ce qui réduit le risque d’exposition.
  • Flexibilité: Avec les variables d’environnement, la mise à jour des paramètres de configuration est simple, car vous pouvez mettre à jour/effectuer des modifications en dehors de la base de code. Les variables d’environnement vous permettent d’ajuster les paramètres de configuration sans modifier votre code. Cette flexibilité est particulièrement utile pour déployer des applications dans différents environnements ou pour mettre à jour des informations d’identification.

Dans les sections suivantes de ce tutoriel, nous allons explorer comment définir, accéder et gérer les variables d’environnement en Python et comment elles améliorent la gestion de la configuration dans vos projets.

Comment définir des variables d’environnement

Vous pouvez définir des variables d’environnement à l’aide de la ligne de commande. La portée de ces variables d’environnement nes’applique qu’à la session en cours – etelles ne persistent pas en dehors de cette session.

Si vous êtes sur un ordinateur Mac ou Linux, vous pouvez définir une variable d’environnement dans votre session de terminal actuelle de la manière suivante :

export MY_VARIABLE=ma_valeur

Si vous êtes un utilisateur Windows, vous pouvez définir temporairement une variable d’environnement comme indiqué ci-dessous :

set MY_VARIABLE=ma_valeur

Accéder aux variables d’environnement en Python

Python fournit le module os pour les fonctionnalités liées au système d’exploitation. Os .environ est un dictionnaire de variables d’environnement. Les noms des variables d’environnement et leurs valeurs sont respectivement les clés et les valeurs du dictionnaire.

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 aux éléments d’un dictionnaire.

Voici quelques exemples :

import os
print(os.environ['HOME'])
# Sortie : /home/balapriya
print(os.environ['USER'])
# Output : balapriya

Jusqu’à présent, tout va bien. Mais que se passe-t-il si vous essayez d’accéder à la valeur d’une variable d’environnement qui n’a jamais été définie ?

Essayons d’accéder à API_KEY que nous n’avons pas encore défini :

print(os.environ['API_KEY'])

Comme prévu, vous obtiendrez une KeyError:

Traceback (dernier appel le plus récent) :
  Fichier "<stdin>", ligne 1, in <module&gt
  File "<frozen os>", line 679, in __getitem__
KeyError : 'API_KEY' (erreur de clé)

Gestion des erreurs de clé

Vous pouvez gérer l’erreur KeyError comme indiqué ci-dessous :

import os

try :
	api_key = os.environ['API_KEY']
	print(f'API_KEY is set to : {api_key}')
except KeyError :
	print('API_KEY n'est pas défini. Veuillez le configurer.')

Cette approche n’arrête pas brusquement l’exécution du programme lorsqu’une exception KeyError est levée. Elle fournit cependant un message d’erreur descriptif :

# Sortie
API_KEY n'est pas défini. Veuillez la configurer.

Ainsi, lorsque le reste du programme ne s’exécute pas comme prévu, nous savons que nous avons omis de configurer une variable d’environnement requise.

Accès aux variables d’environnement à l’aide de la méthode get()

Vous pouvez utiliser la méthode de dictionnaire get( ) pour obtenir la valeur d’une variable d’environnement. Au lieu d’une KeyError, la méthode get( ) renvoie None si la variable n’est pas trouvée.

L’accès à la variable NOT_SET que nous n’avons pas définie renvoie None:

print(os.environ.get('NOT_SET'))
# Sortie : Aucun

Je préfère lever une erreur de clé lorsque la variable d’environnement n’est pas définie. Puis la laisser passer silencieusement ou être subsumée dans le None que la méthode get() renvoie.

Mais la méthode get() est utile lorsque nous pouvons passer une valeur par défaut pour une variable d’environnement particulière si elle n’est pas définie.

Voici un exemple :

print(os.environ.get('HOME','/home/user'))
# Sortie : /home/balapriya

Comment gérer la configuration avec les variables d’environnement

Prenons maintenant quelques exemples pratiques dans lesquels nous utilisons des variables d’environnement dans notre application.

Exemple 1 : Configuration des paramètres de connexion à la base de données

Configuring-Database-Connection-Parameters

Supposons que vous souhaitiez vous connecter à une base de données PostgreSQL depuis Python. Pour ce faire, vous pouvez installer et utiliser le connecteur psycopg2:

pip install psycopg2

Dans cet exemple, nous utilisons des variables d’environnement pour configurer les paramètres de connexion à la base de données. Si les variables d’environnement ne sont pas définies, nous fournissons des valeurs par défaut à utiliser.

import os
import psycopg2  

# Récupérez la configuration de la base de données à partir des variables d'environnement
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')

# Établir une connexion à la base de données
try :
	connection = psycopg2.connect(
    	host=db_host,
    	port=db_port,
    	user=db_user,
    	password=mot_de_passe_db,
    	base de données='mydb'
	)
	print('Connecté à la base de données!')
except Exception as e :
	print(f'Erreur de connexion à la base de données : {e}')

Exemple 2 : gestion des clés API

Prenons un autre exemple qui implique l’utilisation de clés API.

Outre l’interface ChatGPT, vous pouvez également utiliser l’API OpenAI pour prendre en charge les LLM OpenAI dans vos applications.

Lorsque vous vous inscrivez à un compte OpenAI, vous obtenez (généralement) des crédits API gratuits et limités dans le temps. Récupérez votre clé API en naviguant vers Settings > View API Keys.

Vous pouvez utiliser le SDK Open AI Python et un framework comme LangChain pour créer des applications. Pour ce faire, vous devez installer les bibliothèques (dans un environnement virtuel) à l’aide de pip :

pip install openai
pip install langchain 

Voici comment définir la clé OPENAI_API_KEY en tant que variable d’environnement :

import os
os.environ["OPENAI_API_KEY"]='votre-api-clé'

Vous pouvez maintenant accéder aux LLMs Open AI dans votre script comme suit :

from langchain.llms import OpenAI
model=OpenAI(model_name="gpt-3.5-turbo")

Comment modifier les variables d’environnement en Python ?

Vous pouvez utiliser le dictionnaire os.environ du module os pour modifier les variables d’environnement dans le processus Python en cours :

import os

# Modifiez une variable d'environnement existante ou créez-en une nouvelle
os.environ['MY_VARIABLE'] = 'new_value'

En Python, vous pouvez utiliser le module subprocess pour créer des sous-processus à partir d’un script Python existant. Ce qui est utile lorsque vous souhaitez exécuter des programmes système en Python.

Dans l’exemple suivant, nous modifions la variable d’environnement PATH en puisant dans le dictionnaire os.environ. Nous lançons ensuite echo $PATH en tant que sous-processus :

import os
import subprocess

# Définissez une variable d'environnement personnalisée pour le sous-processus
os.environ['PATH'] = '/custom/path'

# Exécutez un sous-processus qui accède à la variable d'environnement PATH
result = subprocess.run("echo $PATH", shell=True, stdout=subprocess.PIPE)
output = result.stdout.decode()
print(output)
print(f'Sortie du sous-processus : {sortie}')

Nous voyons que le PATH prend la valeur de /custom/path:

# Sortie
/custom/path

Portée des variables d’environnement modifiées

Il est important de noter que ces mises à jour de variables d’environnement sont temporaires et ne sont valables que pour le processus Python en cours. Une fois le script terminé, les modifications sont supprimées :

  • Processus Python en cours: Lorsque vous modifiez une variable d’environnement à l’aide de os.environ dans votre script Python, la modification est locale au processus Python en cours. Elle n’affectera pas les autres processus en cours d’exécution ni les futures sessions Python.
  • Processus enfants: Les modifications apportées aux variables d’environnement dans le processus Python en cours sont héritées par les processus enfants créés par votre script. Par exemple, si vous créez un sous-processus à partir de votre script Python (processus parent), le processus enfant aura accès aux variables d’environnement modifiées (comme le montre l’exemple).
  • Pas à l’échelle du système: les variables d’environnement définies dans un script Python ne persistent pas en dehors de l’exécution de ce script.

Si vous devez apporter des modifications persistantes aux variables d’environnement au niveau du système, vous devez généralement le faire en utilisant des méthodes spécifiques au système d’exploitation.

Comment charger les fichiers .env avec python-dotenv

La bibliothèque python-dotenv est un paquetage Python populaire qui simplifie le processus de chargement des variables d’environnement à partir d’un fichier .env dans votre projet Python. Elle est particulièrement utile lorsque vous avez plusieurs environnements (par exemple, développement, production) avec des configurations différentes, et que vous souhaitez conserver ces paramètres séparément 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 – en utilisant pip, le gestionnaire de paquets Python :

pip install python-dotenv

Chargement des variables d’environnement à partir d’un fichier .env

Vous pouvez maintenant créer un fichier .env dans le répertoire racine de votre projet et le remplir avec des paires clé-valeur, tout comme des variables d’environnement normales. Créons le fichier . env suivant avec des valeurs de remplacement :

API_KEY=votre_clé_api_ici
DB_PASSWORD=votre_mot_de_passe_de_la_base_de_données_ici

Vous pouvez maintenant charger les variables d’environnement à partir du fichier . env en utilisant python-dotenv comme suit :

import os
from dotenv import load_dotenv

# Chargement des variables d'environnement à partir du fichier .env
load_dotenv()

# Accédez aux variables d'environnement
api_key = os.getenv("API_KEY")
database_password = os.getenv("DB_PASSWORD")

# Affichez les variables d'environnement
print(f "Clé API : {clé_api}")
print(f "Mot de passe de la base de données : {mot_de_base_de_données}")

Remarquez que nous avons utilisé os.getenv(VARIABLE_NAME) pour obtenir les valeurs des variables d’environnement. Il s’agit également d’une méthode valide (et moins couramment utilisée) pour accéder aux variables d’environnement.

Voici le résultat :

Clé API : votre-clé-api-ici
Mot de passe de la base de données : votre-base-de-données-url-ici

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

Et voilà, c’est terminé ! J’espère que vous avez appris à gérer la configuration et les informations sensibles à l’aide des variables d’environnement dans les applications Python. Nous avons couvert 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 certainement utiles pour séparer la configuration du code source, vous devriez stocker les variables sensibles en tant que secrets dans les cas d’utilisation en production.

Pour gérer les secrets, je vous recommande d’explorer des outils tels que HashiCorp Vault ou AWS Secrets Manager.

Ensuite, vous pouvez également lire des articles sur Python Floats et Python Flask.