At 12:48 AM 4/4/2010 +0200, Tarek Ziadé wrote:
The implementation so far will load zip files founded in the paths,
see ZippedDistributionDir/ZippedDistribution.

I was saying that it doesn't support sys.path entries of the form:

  "some/path/to/somezipfile.zip/subdir1"

Python works correctly for importing with this, but the ZipFinder class in the implementation throws away 'subdir1' and only scans the root of the zipfile, silently generating incorrect results in such a case.

To fix the problem, you would need to make use of the .archive and .prefix attributes of defined by the underlying zipimporter class. After you call the super().__init__ method, .archive points to the actual zipfile path, and .prefix contains the portion of the path that's inside the zipfile. You can then just adjust your path usage in ZipFinder and ZippedDistribution accordingly.

Also, as far as I can tell from the source, ZipFinder instances are never actually created, except through explicit usage in some of the tests. i.e., it doesn't work out of the box right now. However, this could be fixed with the addition of the code snippets below...


I am wondering though, if we shouldn't omit this zip story for PEP 376
altogether, and work later on
something more generic wrt import protocols where modules/packages
could be stored anywhere.

Essentially, you could do something like:

    @simplegeneric  # <-already in stdlib pkgutil since 2.5
    def dist_finder_for(importer):
        if hasattr(importer, 'list_distributions'):
            return importer
        return None

    dist_finder_for.register(ImpImporter, FSFinder)
    dist_finder_for.register(zipimporter, ZipFinder)

And then your all_finders() function would be reduced to:

    def all_finders():
        for importer in iter_importers():  # <-already in stdlib pkgutil
            finder = dist_finder_for(importer)
            if finder is not None:
                 yield finder

As you can see, it's pretty easy to integrate with your existing code. simplegeneric and iter_importers (as well as a get_importer(pathentry) function, ImpImporter, etc.) have been in pkgutil since 2.5, but you can always backport them if you're making a standalone version for 2.4.



_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to