# `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'