pyzipper
========

A small tool to package up a Python program and associated data files
as a single executable zip file.

All the facilities for this are already built into Python, this script
just ties it all together with a bow.

`demo1` and `demo2` are two trivial sample packages.

The `Makefile` is just a driver for the demos.  `pyzipper` itself is
all you need if you want to use this yourself.

Tested with both Python 2 and Python 3, should work with either.

How it works
------------

This relies on two somewhat obscure Python features:

* The `zipfile.PyZipFile` class's ability to construct an executable
  ZIP file and populate it with Python modules, packages, and data;
  and
  
* Python's ability to treat a zip file as equivalent to a directory
  tree on `import`.
  
`demo1` takes advantage of a third obscure feature: the `pkgutil`
library's ability to load data files via the `import` system.

Usage
-----

This is what `pyzipper --help` returns as of this writing.  The
program itself is authoritative, this is just a snapshot for
convenience.

> usage: pyzipper [-h] -o OUTPUT [-m MODULE] [-e EXECUTABLE] source
>
> Generate an executable Python zip package.
>
> positional arguments:
>   source
>
> optional arguments:
>   -h, --help            show this help message and exit
>   -o OUTPUT, --output OUTPUT
>   -m MODULE, --module MODULE
>                         module within package to run (default: main)
>   -e EXECUTABLE, --executable EXECUTABLE
>                         python executable to run (default: python)