Up.oN
#25/03/20225 - Update: #15/04/25

Introduction à l'Univers Python

Ce cour présente le langage Python. Son univers, à savoir: les modules et packages, l'auto-loading, le gestionnaire de dépendances pip, et enfin ce qu'est l'environnement virtuel.

Présentation de Python

Python est un langage de programmation polyvalent créé par Guido van Rossum et lancé en 1991. Il est apprécié pour sa simplicité et sa lisibilité, ce qui le rend accessible aux débutants tout en étant puissant pour les développeurs expérimentés.

Caractéristiques Principales :

  • Syntaxe Claire: Python utilise une syntaxe proche du langage naturel, facilitant la lecture et l'écriture du code.
  • Polyvalence: Utilisé dans divers domaines tels que le développement web, l'analyse de données, l'intelligence artificielle, et l'automatisation.
  • Communauté Active: Une large communauté contribue à son développement et à sa documentation, offrant de nombreuses ressources et bibliothèques.

Utilisations Courantes :

  • Développement Web: Frameworks comme Django et Flask.
  • Analyse de Données: Bibliothèques telles que Pandas, NumPy, et Matplotlib.
  • Intelligence Artificielle: TensorFlow et PyTorch pour le machine learning.
  • Automatisation: Scripts pour automatiser des tâches répétitives.

Python est un choix populaire pour les développeurs grâce à sa flexibilité et à la richesse de ses bibliothèques, permettant de répondre à une multitude de besoins de programmation.

Site officiel pour l'installation: python.org

Modules et Package

Les modules et packages sont des éléments fondamentaux de l'organisation du code en Python. Ils permettent de structurer les programmes de manière modulaire et réutilisable.

Les modules

  • Définition: Un module est un fichier Python contenant des définitions et des instructions. Il peut inclure des fonctions, classes, et variables.
  • Création : Pour créer un module, il suffit de créer un fichier .py contenant le code souhaité.
  • Importation: Utilisez import nom_module pour importer un module et accéder à ses fonctionnalités.
import math

print(math.sqrt(16))  # Affiche 4.0
from math import pi

print(pi)
# exemples avec plusieurs modules

import random, os, sys, re

Les Packages

  • Définition: Un package est un répertoire contenant plusieurs modules et un fichier spécial __init__.py, qui indique à Python que le répertoire doit être traité comme un package.
  • Structure : Les packages permettent d'organiser les modules de manière hiérarchique, facilitant la gestion de grands projets.
  • Importation: Utilisez import nom_package.nom_module pour importer un module d'un package.

Structure d'un package:

mon_package/
    __init__.py
    module1.py
    module2.py

Le Fichier __init__.py

Ce fichier est présent dans le dossier du package afin d'indiquer à Python que ce répertoire doit être traité comme un package.

Code d'initialisation: il peut contenir du code qui s'exécute lors de l'importation du package. Vous pouvez ainsi définir des variables, initialiser des ressources ou même importer automatiquement certains sous-modules du package.

Exemple simple d'un fichier __init__.py :

# __init__.py

# Importation directe de sous-modules pour les rendre accessibles
from . import module1
from . import module2

# Variable __all__ pour contrôler l'exportation des noms
__all__ = ["module1", "module2"]

Le Rôle de __all__

La variable spéciale __all__ est une liste de chaînes de caractères qui définit explicitement les noms publics à exporter lorsqu'on utilise la syntaxe: from mon_package import *

Cela permet de limiter quels modules, classes ou fonctions sont exposés à l'utilisateur du package. Seuls les éléments listés dans __all__ seront importés.

En restreignant l'importation globale, vous évitez d'accéder accidentellement à des fonctions ou à des variables internes non destinées à l'usage externe.

Exemple:

# Définition des éléments exportés publiquement par le package
__all__ = ["module1", "module2"]

Ainsi, lorsque l'on exécute : from mon_package import *
Seuls module1 et module2 seront importés et accessibles, ce qui permet d'encapsuler le code non destiné à être exposé.


Les modules et packages sont essentiels pour écrire du code propre et maintenable, en permettant de séparer les fonctionnalités et de réutiliser le code efficacement.

Mettre à jour les paquets

Voici une méthode proposée par python.19633.com.

Exécuter la commande: pip list --outdated > outdated.txt

Penser à sauvegarder votre travail via git par exemple avant de mettre à jour. Puis executer le script suivant:

'''
1. run this commande: 
    pip list --outdated > outdated.txt
2. run this script:
    py upd.py
Source: https://python.19633.com/fr/Python/1001015136.html
Update by Le chat Mistral IA - #09/04/25
'''
import subprocess

# Lire les paquets obsolètes
with open("outdated.txt", 'r') as packages_file:
# Ignorer les deux premières lignes d'en-tête
    packages_file.readline()
    packages_file.readline()

    for line in packages_file:
        if line.strip():
            package_name = line.split()[0]
            print(f"Mise à jour de {package_name}...")
            try:
                subprocess.check_call(["pip", "install", "--upgrade", package_name])
            except subprocess.CalledProcessError as e:
                print(f"Erreur lors de la mise à jour de {package_name}: {e}")

Étant débutant en Python, je ne peux évaluer la qualité de cette méthode. Elle semble fonctionner.

Le module search path

Lorsque vous faites un import en Python, l'interpréteur doit localiser le module demandé. Le module search path (chemin de recherche des modules) est la liste des répertoires que Python parcourt pour trouver le module correspondant à votre import. Cette recherche se fait selon un ordre prédéfini, influencé par plusieurs facteurs, comme le répertoire courant, la variable d'environnement PYTHONPATH et les répertoires standards de l'installation de Python.

La variable sys.path

sys.path est une liste Python, accessible via le module sys, qui contient tous les chemins dans lesquels Python cherche les modules.

Ordre de recherche :

  1. Le répertoire courant: Le dossier à partir duquel le script est exécuté.
  2. Les chemins spécifiés dans la variable d'environnement PYTHONPATH (si définie): Ces chemins supplémentaires permettent de personnaliser la recherche de modules.
  3. Les répertoires d'installation standard et les packages tiers: Ceux-ci incluent les bibliothèques standards et les répertoires d'extensions installées (exemple : site-packages).

Consultation et modification: Vous pouvez consulter le contenu de sys.path avec:

import sys
    print(sys.path)

Et si besoin, ajouter un répertoire temporairement: sys.path.append('/chemin/vers/mon/module')

ou, pour l'ajouter en priorité: sys.path.insert(0, '/chemin/vers/mon/module')

La variable d'environnement PYTHONPATH

PYTHONPATH est une variable d'environnement qui peut être définie dans votre système d'exploitation (Unix, Linux, Windows). Elle permet d'ajouter des chemins supplémentaires à sys.path avant que Python ne parcoure les répertoires standards.

Par exemple, sur une machine Unix, vous pouvez l'ajouter dans votre terminal ou dans votre fichier de configuration shell (.bashrc ou .zshrc): export PYTHONPATH=/chemin/vers/mes/modules
Ainsi, tout module placé dans /chemin/vers/mes/modules pourra être importé directement dans vos scripts Python.

Comment Python cherche un module

  1. L(importation: lorsque vous utilisez une instruction telle que import mon_module, Python cherche d'abord un fichier mon_module.py, puis un package nommé mon_module (dossier contenant un fichier __init__.py) dans chacun des répertoires listés dans sys.path.
  2. L'ordre de priorité:
    • Python regarde d'abord dans le répertoire courant.
    • Ensuite, il parcourt les répertoires indiqués dans PYTHONPATH (si définie).
    • Pour finir, il recherche dans les répertoires standards (installation de Python et site-packages)
  3. Cas spécifiques:
    • Si plusieurs modules portant le même nom se trouvent dans différents dossiers de sys.path, le premier trouvé dans l'ordre de cette liste sera importé.
    • En cas de conflit, il est souvent recommandé de gérer soigneusement l'organisation des répertoires ou d'utiliser des environnements virtuels pour isoler les dépendances.

Modification dynamique et bonnes pratiques

Modification dynamique

Vous pouvez modifier sys.path à la volée dans votre script pour ajouter ou réordonner les chemins de recherche. Cette technique doit être utilisée avec précaution pour éviter des conflits ou des difficultés à maintenir le code.

Bonnes pratiques

  • Utiliser des environnements virtuels (comme venv ou conda) pour isoler les dépendances et avoir un contrôle plus fin sur le module search path.
  • Limitez la modification de sys.path dans votre code afin de garder une structure claire et prévisible.
  • Organisez vos projets en utilisant une structure de packages recommandée, ce qui réduit le besoin de modifier manuellement le chemin de recherche.

__name__

En Python, __name__ est une variable spéciale qui permet de déterminer si un module (un fichier Python) est exécuté directement ou s'il est importé dans un autre module.

Comment ça marche?

Exécution directe: Quand vous lancez un fichier Python directement (par exemple, en exécutant python mon_script.py), la variable __name__ dans ce fichier est automatiquement définie à la valeur "__main__".
Cela signifie que le code contenu dans ce module est exécuté en tant que programme principal.

Importation d'un module: Si le même fichier est importé dans un autre module, alors __name__ prend la valeur du nom du module (généralement le nom du fichier sans l'extension .py).
Ainsi, le bloc de code qui dépend de if __name__ == "__main__": ne sera pas exécuté lors de l'importation.

À quoi ça sert ?

L'utilisation principale de __name__ est de séparer le code qui devrait s'exécuter lors de l'exécution directe du module de celui qui doit être accessible lors d'une importation.
Concrètement, cela permet de :

  • Inclure des tests ou des exemples d'utilisation: Vous pouvez placer du code de démonstration ou des tests dans le bloc conditionnel qui ne s'exécutera que lorsque le module est le programme principal.
    Ainsi, si quelqu'un importe votre module pour réutiliser ses fonctions, le code de test ne s'exécutera pas automatiquement.
  • Organiser le code de manière propre et modulaire: Vous pouvez définir des fonctions, classes ou variables au niveau du module, et contrôler l'exécution d'un bloc particulier (souvent une fonction main()) lorsque le script est lancé directement.

Exemple concret

Imaginons un module appelé calcul.py:

# calcul.py

def addition(a, b):
    return a + b

def multiplication(a, b):
    return a * b

if __name__ == "__main__":
# Ce bloc s'exécute uniquement si le module est exécuté en tant que programme principal
    print("Exécution directe de calcul.py")
    x, y = 3, 4
    print("Addition :", addition(x, y))
    print("Multiplication :", multiplication(x, y))

Quand vous exécutez calcul.py directement: la condition if __name__ == "__main__": est vraie, et donc le code à l'intérieur de ce bloc est exécuté, affichant les résultats.

Quand vous importez calcul.py dans un autre fichier (par exemple, programme.py):

# programme.py
import calcul

print("Utilisation de la fonction addition :", calcul.addition(5, 6))

Dans ce cas, __name__ dans calcul.py vaudra "calcul", et le bloc conditionnel ne sera pas exécuté. Vous pourrez ainsi utiliser les fonctions sans déclencher le code de démonstration ou de test.

Avantages de cette pratique

  • Modularité: Permet de réutiliser le même module dans différents contextes sans exécuter de code superflu.
  • Sécurité: Évite l'exécution accidentelle de code non destiné à être exécuté lors de l'importation, ce qui pourrait provoquer des effets secondaires non désirés.
  • Clarté du code: Favorise une organisation claire du code, distinguant la définition des fonctions/classes de leur utilisation ou test lors de l'exécution directe.

En résumé, __name__ est un mécanisme fondamental en Python qui améliore la réutilisabilité et la modularité de votre code. Il vous permet de créer des modules qui fonctionnent à la fois comme des bibliothèques importables et comme des programmes autonomes, en exécutant un bloc de code spécifique uniquement lorsque cela est nécessaire.

Auto-loading

L'auto-loading en Python fait référence à la capacité du langage à charger automatiquement des modules et des packages lorsqu'ils sont nécessaires. Cela permet une gestion dynamique des dépendances et améliore l'efficacité du code.

Concept d'Auto-loading :

  • Définition: L'auto-loading permet de charger des modules ou des parties de code uniquement lorsqu'ils sont requis, plutôt que de tout charger au démarrage du programme.
  • Avantages: Réduit l'utilisation de la mémoire et améliore les performances en ne chargeant que les composants nécessaires.

Utilisation des Modules et Packages :

  • Importation Dynamique: Utilisez importlib pour importer des modules dynamiquement en fonction des besoins du programme.
  • Différence entre import et from ... import ... :
    • import module: Charge tout le module et nécessite d'utiliser le préfixe du module (ex. : module.fonction()).
    • from module import fonction: importe uniquement la fonction spécifiée, permettant de l'utiliser directement (ex. : fonction()).

Exemple Pratique :

import importlib

# Importation dynamique d'un module
module_name = 'math'
module = importlib.import_module(module_name)

# Utilisation d'une fonction du module importé
result = module.sqrt(16)
print(result)  # Affiche 4.0

L'auto-loading est particulièrement utile dans les grands projets où il est crucial de gérer efficacement les ressources et d'optimiser les performances.

Gestionnaire de Dépendances : pip

pip est l'outil de gestion des paquets pour Python, permettant d'installer et de gérer les bibliothèques supplémentaires nécessaires à vos projets.

  • Définition: pip est un gestionnaire de paquets qui facilite l'installation et la gestion des bibliothèques Python.
  • Installation: pip est généralement inclus avec les installations récentes de Python. Vous pouvez vérifier sa présence en exécutant pip --version dans votre terminal.

Commandes de Base:

  • Installer un Package: pip install nom_package
  • Désinstaller un Package: pip uninstall nom_package
  • Lister les Packages Installés: pip list
  • Mettre à Jour un Package: pip install --upgrade nom_package

Utilisation de requirements.txt:

  • Définition: Un fichier requirements.txt liste toutes les dépendances d'un projet, facilitant leur installation en une seule commande.
  • Création manuelle: Liste les packages nécessaires avec leur version (ex. : numpy==1.21.2).
  • Création Avec pip freeze: Génère automatiquement un fichier requirements.txt basé sur les packages actuellement installés dans l'environnement. Utilisez pip freeze > requirements.txt.
  • Installation: pip install -r requirements.txt

Alternatives :

  • pipenv: Combine pip et virtualenv pour une gestion simplifiée des environnements virtuels et des dépendances.
  • poetry: Un outil moderne pour la gestion des dépendances et des environnements, offrant des fonctionnalités avancées pour les projets Python.

pip est essentiel pour gérer les dépendances de vos projets Python, assurant que toutes les bibliothèques nécessaires sont installées et à jour. Nous y reviendrons dans la section suivante.

Gestion des packages tiers

Introduction à l'index des packages Python (PyPI)

Python dispose d'une bibliothèque standard riche que vous pouvez utiliser immédiatement dans vos projets. Cependant, si vous avez besoin d'un package qui n'est pas disponible dans la bibliothèque standard, vous pouvez le trouver sur l'Index des Packages Python (PyPI).

Le Python Package Index (PyPI) est le plus grand dépôt de packages Python. Il contient de nombreux packages Python développés et maintenus par la communauté Python. Pour trouver un package, vous pouvez utiliser la barre de recherche sur le site PyPI. Par exemple, pour rechercher des packages qui traitent des requêtes HTTP, vous pouvez simplement utiliser le mot-clé requests.

Version des packages

Les packages Python utilisent la version sémantique, qui se compose de trois numéros : version majeure, version mineure et correctif (patch) :

  • Correctif (patch): incrémenté pour les modifications mineures et les corrections de bugs qui ne changent pas le fonctionnement du package.
  • Mineure: incrémentée pour les versions qui ajoutent de nouvelles fonctionnalités rétrocompatibles.
  • Majeure: incrémentée pour les changements qui ne sont pas rétrocompatibles.

Par exemple, le package requests a la version 2.24.0 (au moment de l'écriture). Cela signifie que la version majeure est 2, la version mineure est 24, et le correctif est zéro. Si vous utilisez la version 2.24.0 dans votre projet, vous pouvez la mettre à niveau vers n'importe quelle version ayant la version majeure 2, par exemple 2.25.1. Cependant, si vous installez une version avec une version majeure plus élevée, par exemple 3.0.0, votre application risque de ne pas fonctionner correctement.

Qu'est-ce que pip ?

pip est l'installateur de package pour Python. Il permet d'installer des packages depuis PyPI et d'autres dépôts. Python est livré avec pip par défaut. Pour vérifier si pip est disponible sur votre ordinateur, vous pouvez ouvrir l'invite de commande (ou PowerShell) sur Windows et taper la commande suivante:
pip --version

Sur macOS ou Linux, vous pouvez lancer le terminal et utiliser pip3 à la place de pip:
pip3 --version

Installer un package

Pour installer un package depuis PyPI, utilisez la commande suivante sur Windows:
pip install <package_name>

Et remplacez pip par pip3 sur macOS et Linux:
pip3 install <package_name>

Par exemple, la commande suivante installe le package requests:
pip install requests

Vous pouvez maintenant utiliser le package requests dans n'importe quel projet. Par exemple, le code suivant utilise le package requests pour faire une requête HTTP à https://pypi.org/ et affiche le code de statut HTTP :

import requests

response = requests.get('https://pypi.org/')
print(response.status_code)            

Pour installer une version spécifique d'un package, utilisez la commande suivante:
pip install <package_name>==<version>

Par exemple, pour installer la version 2.20.1 du package requests:
pip install requests==2.20.1

Lister les packages installés

Pour lister tous les packages installés, utilisez la commande suivante:
pip list

Cela retournera une liste des packages installés sur votre ordinateur. Pour vérifier quels packages sont obsolètes, utilisez la commande suivante:
pip list --outdated

Désinstaller un package

Pour désinstaller un package, utilisez la commande suivante:
pip uninstall <package_name>

Cela vous demandera une confirmation avant de désinstaller le package.

Lister les dépendances d'un package

Lorsque vous installez un package et que ce package utilise d'autres packages, pip installera le package ainsi que ses dépendances. Pour afficher les dépendances d'un package, utilisez la commande suivante:
pip show <package_name>

Par exemple, pour afficher les dépendances du package requests:
pip show requests

La ligne Requires liste les packages utilisés par le package requests.

Environnements Virtuels

Les environnements virtuels sont essentiels pour isoler les dépendances de vos projets Python, évitant ainsi les conflits entre les versions des bibliothèques.

Pourquoi Utiliser des Environnements Virtuels ?

  • Isolation: Permet d'avoir des environnements indépendants pour chaque projet, évitant les conflits de dépendances.
  • Reproductibilité: Facilite la reproduction de l'environnement de développement sur différentes machines.
  • Gestion des Dépendances: Simplifie la gestion des bibliothèques nécessaires à chaque projet.

Création et Activation d'un Environnement Virtuel:

  • Création: Utilisez python -m venv nom_environnement pour créer un environnement virtuel.
  • Activation:
    • Windows : nom_environnement\Scripts\activate
    • macOS/Linux: source nom_environnement/bin/activate
  • Désactivation: Tapez simplement deactivate pour quitter l'environnement virtuel.

Comparaison avec d'autres Outils:

  • conda: Un gestionnaire de paquets et d'environnements, particulièrement utilisé dans les domaines scientifiques, offrant des fonctionnalités similaires à venv mais avec une gestion plus large des dépendances non-Python.

Les environnements virtuels sont indispensables pour maintenir des projets Python organisés et exempts de conflits de dépendances, garantissant ainsi une meilleure gestion et portabilité des projets.


Source: Conceptualisé par mes soins et rédiger via le concours du Chat (mistral.AI).