[Distutils] Re: Add multiple frozen modules

Greg Stein gstein@lyra.org
Thu, 15 Jul 1999 14:37:58 -0700


James C. Ahlstrom wrote:
> Christian Tismer wrote:
> > Yes, and to complete it: The append trick *does* work on Unix.
> > And a resource like management of things could be written
> > with Python, defining our own resources. Why care about an OS?
> 
> [Jim ponders the append trick...]
> 
> OK, a really simple idea is to do this:
>   cat python.exe string.pyc site.pyc > myprog.exe
> That is, just append a bunch of *.pyc to the executable.
> Anybody can do that.  Then make the import mechanism be
> able to find them.  So, look for the *.pyc magic numbers.
> To recover the module names, use the base file name of the
> code object attribute co.co_filename.
> 
> Same with Python15.dll, append *.pyc to it too.

You can make it a lot easier on yourself if you remember the byte offset
of each of those .pyc files. Then, you append a marshalled dictionary
mapping the names to the offsets (and remember the byte offset of this
marshalled dict). Finally, you append the byte offset of the dict.

Recovery is then very easy: seek to (-4) from the end and read the
offset. Seek there and unmarshall the dict. Seek to whichever module you
want and unmarshal that.

I used this technique in constructing my Python library of modules in
the small distribution. The offset was at the beginning cuz it was a
self-defined format so I just seeked back to the start to write out the
file's magic value + offset. But the technique works for appending, too.

Personally, I think it is a hack to simply append stuff to an executable
(Unix or Windows). I would much rather see a proper COFF or ELF section
inserted in there which contains the modules.

Cheers,
-g

--
Greg Stein, http://www.lyra.org/