[Python-Dev] zipimport, round 3 (or would that be that 37?)

Just van Rossum just@letterror.com
Sun, 8 Dec 2002 01:44:47 +0100


--7584767-3623878656-3248300694=:9002
Content-Type: text/plain; Charset=US-ASCII
Content-Transfer-Encoding: 7bit

Here's the current state of my stuff. I'd rather post it now than to fiddle
more: I'm too tired, I'd only break stuff...

I currently build the zipimport module as a builtin to avoids some bootstrapping
pitfalls (*). It should still work as a shared lib *provided* it is available on
sys.path *before* site.py is run. The same goes more or less for zlib unless
you're using uncompressed archives.

The test suite ran fine with the std lib packaged as a zip file (minus the test
suite it, as it globs for *.py in Lib/test/), apart from three tests that do
stuff with module.__file__ (eg. email can't find it's data files ;-).

Highlights:

- zip file names on sys.path work
- zip file names PYTHONPATH work
- sys.path still contains strings
- module.__file__ is still a regular string, looking like this:
    '/path/to/archive.zip/path/to/module.pyc'
- pkg.__path__ still contains a regular string, that looks like this:
    '/path/to/archive.zip/path/to/packagedir/'

I'll write a bit about the mechanics tomorrow, but in the meantime I would like
to see some test results/bug reports/bug fixes from Windows developers. Please
don't start with the full monty (ie. the std lib), try a small test archive
first please ;-)

There's still plenty to do regarding imp module integration, minor things like
reload() not being supported yet, etc. Nevertheless I think the import.c patch
is remarkably small for what it accomplishes. Needless to say, the zipimport
module itself also needs work.

Fun, fun!

Just

*) It's mostly a problem when you're running Python from the source directory,
when site.py adds stuff to sys.path to get a running system: by then it's too
late to find zipimport. It should be less of a problem with a regular install,
but I haven't tried.
--7584767-3623878656-3248300694=:9002
Content-Type: application/octet-stream; Name="zipper3.tgz"; X-Mac-Type="00000000"; X-Mac-Creator="00000000"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; Filename="zipper3.tgz"

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
--7584767-3623878656-3248300694=:9002--