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.