zip files as nested modules?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • tsuraan

    #1

    zip files as nested modules?

    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('.zi p')]
    zips = [os.path.join(he re, z) for z in zips]

    for z in zips:
    print z
    mod = os.path.split(z )[-1][:-4]
    print mod
    globals()[mod] = zipimport.zipim porter(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?
  • Luciano Ramalho

    #2
    Re: zip files as nested modules?

    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/

    Comment

    Working...