zip files as nested modules?

T

tsuraan

Supposing that I have a directory tree like so:

a/
__init__.py
b/
__init__.py
c.py

and b.py has some method (let's call it d) within it. I can, from python, do:

from a.b.c import d
d()

And, that works. Now, suppose I want to have a zipped module under a,
called b.zip. Is there any way that I can accomplish the same thing,
but using the zip file as the inner module?

My directory layout is then

a/
__init__.py
b.zip

And b is a zipfile laid out like

b/
__init__.py
c.py

I tried populating a's __init__ with this:

import zipimport
import os
here = os.path.join(os.getcwd(), __path__[0])
zips = [f for f in os.listdir(here) if f.endswith('.zip')]
zips = [os.path.join(here, z) for z in zips]

for z in zips:
print z
mod = os.path.split(z)[-1][:-4]
print mod
globals()[mod] = zipimport.zipimporter(z).load_module(mod)

All the zip modules appear (I actually have a few zips, but that
shouldn't be important), but their contents do not seem to be
accessible in any way. I could probably put import statements in all
the __init__.py files to import everything in the level below, but I
am under the impression that relative imports are frowned upon, and it
seems pretty bug-prone anyhow.

Any pointers on how to accomplish zip modules being nested within normal ones?
 
L

Luciano Ramalho

Importing modules from zip files was proposed in PEP-273 [1]

Here is how the spec of PEP-273 begins:

'''
Currently, sys.path is a list of directory names as strings. If this
PEP is implemented, an item of sys.path can be a string naming a zip
file archive.
'''

My interpretation of the above is that, to be importable, a zip file
must be explicitly named in sys.path.

So the mere fact that a zip file lies somewhere in a directory which
is part of the sys.path does not make it importable.

Cheers,

Luciano


[1] http://www.python.org/dev/peps/pep-0273/
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,990
Messages
2,570,211
Members
46,796
Latest member
SteveBreed

Latest Threads

Top