"zipimport" — Import de modules à partir d'archives Zip
*******************************************************

**Code source :** Lib/zipimport.py

======================================================================

Ce module ajoute la possibilité d'importer des modules Python ("*.py",
"*.pyc") et des paquets depuis des archives au format ZIP. Il n'est
généralement pas nécessaire d'utiliser explicitement le module
"zipimport" ; il est automatiquement utilisé par le mécanisme intégré
de "import" pour les éléments de "sys.path" qui sont des chemins vers
des archives ZIP.

En général, "sys.path" est une liste de noms de répertoires sous forme
de chaînes.  Ce module permet également à un élément de "sys.path"
d'être une chaîne nommant une archive de fichier ZIP. L'archive peut
contenir une arborescence de répertoires pour prendre en charge les
importations de paquets, et un chemin dans l'archive peut être donné
pour importer uniquement à partir d'un sous-répertoire.  Par exemple,
le chemin d'accès "example.zip/lib/" importerait uniquement depuis le
sous-répertoire "lib/" dans l'archive.

Tous les fichiers peuvent être présents dans l'archive ZIP, mais les
importateurs ne sont invoqués que pour les fichiers ".py" et ".pyc".
L'importation ZIP de modules dynamiques (".py", ".so") n'est pas
permise. Notez que si une archive ne contient que des fichiers ".py",
Python n'essaiera pas de modifier l'archive en ajoutant le fichier
".pyc" correspondant, ce qui signifie que si une archive ZIP ne
contient pas de fichiers ".pyc", l'importation peut être assez lente.

Modifié dans la version 3.8: auparavant, les archives ZIP avec un
commentaire d’archive n’étaient pas prises en charge.

Voir aussi:

  PKZIP Application Note
     Documentation sur le format de fichier ZIP par Phil Katz,
     créateur du format et des algorithmes utilisés.

  **PEP 273** — Importation de modules depuis des archives ZIP
     Écrit par James C. Ahlstrom, qui a également fourni une mise en
     œuvre. Python 2.3 suit les spécifications de **PEP 273**, mais
     utilise une implémentation écrite par Just van Rossum qui utilise
     les crochets d'importation décrits dans **PEP 302**.

  "importlib" — Implémentation du système d'importation
     Paquet qui définit les protocoles que doivent implémenter tous
     les objets importateurs.

Ce module définit une exception :

exception zipimport.ZipImportError

   Exception levée par les objets *zipimporter*. C'est une sous-classe
   de "ImportError", donc elle peut être aussi interceptée comme une
   "ImportError".


Objets *zimporter*
==================

"zipimporter" est la classe pour importer des fichiers ZIP.

class zipimport.zipimporter(archivepath)

   Classe d'objets qui importent depuis les archives. Dans le
   constructeur, *archivepath* doit être un chemin vers un fichier
   ZIP, éventuellement augmenté d'un chemin à l'intérieur de
   l'archive.  Par exemple, un *archivepath* de "foo/bar.zip/lib"
   cherchera les modules dans le répertoire "lib" du fichier ZIP
   "foo/bar.zip" (à supposer que ce répertoire existe).

   "ZipImportError" est levée si *archivepath* ne pointe pas vers une
   archive ZIP valide.

   create_module(spec)

      Implémentation de "importlib.abc.Loader.create_module()". Elle
      renvoie toujours "None", ce qui déclenche le mécanisme standard.

      Nouveau dans la version 3.10.

   exec_module(module)

      Implémentation de "importlib.abc.Loader.exec_module()".

      Nouveau dans la version 3.10.

   find_loader(fullname, path=None)

      Implémentation de "importlib.abc.PathEntryFinder.find_loader()".

      Obsolète depuis la version 3.10: utilisez plutôt "find_spec()".

   find_module(fullname, path=None)

      Recherche un module spécifié par *fullname*, qui doit être le
      nom du module entièrement qualifié (avec des points). La valeur
      renvoyée est l'instance de *zipimporter* elle-même si le module
      a été trouvé, ou "None" si ce n'est pas le cas. L'argument
      optionnel *path* est ignoré ; il est là pour la compatibilité
      avec le protocole de l'importateur.

      Obsolète depuis la version 3.10: utilisez plutôt "find_spec()".

   find_spec(fullname, target=None)

      Implémentation de "importlib.abc.PathEntryFinder.find_spec()".

      Nouveau dans la version 3.10.

   get_code(fullname)

      Renvoie l'objet de code pour le module spécifié. Lève
      "ZipImportError" si l'importation a échoué.

   get_data(pathname)

      Renvoie les données associées à *pathname*. Lève "OSError" si le
      fichier n'a pas été trouvé.

      Modifié dans la version 3.3: "IOError" used to be raised, it is
      now an alias of "OSError".

   get_filename(fullname)

      Renvoie la valeur "__file____" qui serait définie si le module
      spécifié était importé. Lève "ZipImportError" si l'importation a
      échoué.

      Nouveau dans la version 3.1.

   get_source(fullname)

      Renvoie le code source du module spécifié. Lève "ZipImportError"
      si le module n'a pas pu être trouvé, renvoie "None" si l'archive
      contient le module, mais n'en a pas la source.

   is_package(fullname)

      Renvoie "True" si le module spécifié par *fullname* est un
      paquet. Lève "ZipImportError" si le module n'a pas pu être
      trouvé.

   load_module(fullname)

      Charge et renvoie le module spécifié par *fullname*, qui doit
      être le nom du module entièrement qualifié (avec des points).
      Lève "ZipImportError" si l'importation a échoué.

      Obsolète depuis la version 3.10: utilisez plutôt
      "exec_module()".

   invalidate_caches()

      Efface le cache interne des informations sur les fichiers à
      l'intérieur de l'archive ZIP.

      Nouveau dans la version 3.10.

   archive

      Le nom de fichier de l'archive ZIP associé à l'importateur, sans
      sous-chemin à l'intérieur.

   prefix

      Le sous-chemin du fichier ZIP où les modules sont recherchés.
      C'est la chaîne vide pour les objets *zipimporter* qui pointent
      vers la racine du fichier ZIP.

   On a schématiquement "archive" + "'/'" + "prefix" == *archivepath*,
   où *archivepath* est l'argument donné au constructeur
   "zipimporter".


Exemples
========

Voici un exemple qui importe un module d'une archive ZIP — notez que
le module "zipimport" n'est pas explicitement utilisé.

   $ unzip -l example.zip
   Archive:  example.zip
     Length     Date   Time    Name
    --------    ----   ----    ----
        8467  11-26-02 22:30   jwzthreading.py
    --------                   -------
        8467                   1 file
   $ ./python
   Python 2.3 (#1, Aug 1 2003, 19:54:32)
   >>> import sys
   >>> sys.path.insert(0, 'example.zip')  # Add .zip file to front of path
   >>> import jwzthreading
   >>> jwzthreading.__file__
   'example.zip/jwzthreading.py'
