← retour aux snippets

zipimport: importer un module depuis un .zip

Charger du code Python directement depuis une archive zip.

python import #zipimport#zip#modules

objectif

Charger du code Python directement depuis une archive zip.

code minimal

import zipimport, zipfile, tempfile, pathlib, textwrap
with tempfile.TemporaryDirectory() as tmp:
    z = pathlib.Path(tmp)/"pkg.zip"
    with zipfile.ZipFile(z, "w", zipfile.ZIP_DEFLATED) as zp:
        zp.writestr("m.py", "x=1\n")
    importer = zipimport.zipimporter(str(z))
    m = importer.load_module("m")
    print(getattr(m, "x", 0) == 1)  # attendu: True

utilisation

import sys, zipfile, tempfile, pathlib
with tempfile.TemporaryDirectory() as tmp:
    z = pathlib.Path(tmp)/"code.zip"
    with zipfile.ZipFile(z, "w") as zp:
        zp.writestr("pkg/__init__.py", "")
        zp.writestr("pkg/mod.py", "def f(): return 2\n")
    sys.path.insert(0, str(z))
    import pkg.mod as mod
    print(mod.f() == 2)
    sys.path.remove(str(z))

variante(s) utile(s)

import zipimport
print(hasattr(zipimport, "zipimporter"))

notes

  • Ajouter l’archive au sys.path permet un import standard.
  • Utile pour déployer un seul fichier zip embarquant un paquet.