#!/usr/bin/env python3 """Empacota uma pasta como .pyxapp (o formato do "pyxel package"), de forma deterministica. python3 -I pyxapp.py O zip tem uma pasta (o nome da pasta de origem) com o marcador .pyxapp_startup_script (o caminho do script inicial, relativo a ela) e todos os arquivos em ordem alfabetica, com data e permissoes fixas (mesmo sha256 a cada execucao). Pastas __pycache__ e arquivos .pyc ficam de fora. """ import os import sys import zipfile src, startup, dest = sys.argv[1:] src = os.path.abspath(src) app = os.path.basename(src) if not os.path.isfile(os.path.join(src, startup)): raise SystemExit(f"{startup} nao existe em {src}") files = {} for base, dirs, names in os.walk(src): dirs[:] = [d for d in dirs if d != "__pycache__" and not d.startswith(".")] for name in names: if name.endswith(".pyc") or name.startswith("."): continue rel = os.path.relpath(os.path.join(base, name), src).replace(os.sep, "/") files[f"{app}/{rel}"] = os.path.join(base, name) with zipfile.ZipFile(dest, "w", zipfile.ZIP_DEFLATED, compresslevel=9) as z: def add(arcname, data): info = zipfile.ZipInfo(arcname, (1980, 1, 1, 0, 0, 0)) info.compress_type = zipfile.ZIP_DEFLATED info.external_attr = 0o644 << 16 info.create_system = 3 z.writestr(info, data, compresslevel=9) add(f"{app}/.pyxapp_startup_script", startup) for arcname in sorted(files): with open(files[arcname], "rb") as fh: add(arcname, fh.read())