[Distutils] Possible to import from a zipfile retrieved from within an .egg using pkg_resource's ResourceManager API?
P.J. Eby
pje at telecommunity.com
Wed Jul 22 02:24:44 CEST 2009
At 07:02 PM 7/21/2009 -0500, Dave Peterson wrote:
>Background:
>The Mayavi project generates wrapper code around VTK during it's
>build process. This gets bundled into a zip file called
>tvtk_classes.zip and included in a binary distribution. Currently,
>we mark built eggs as non-zip-safe so that they get unpacked during
>installation, which makes it possible to find the zip file and add
>it directly to sys.path.
>However, this mechanism won't work when someone tries to distribute
>an app containing Mayavi by using py2app, py2exe, etc. because all
>of site-packages usually gets bundled in a single zip.
>
>Problem:
>I'm wondering if there is some way to use pkg_resources to retrieve
>a reference to the embedded zip file within py2app's generated
>site-packages.zip (or within an unpacked egg install) and somehow
>add that to sys.path? The only obvious thing I see in
>pkg_resource's ResourceManager API docs is to extract the embedded
>zipfile via "resource_filename". However, it isn't clear to me
>whether calling that will extract *everything* within the containing
>zip, or just unpack the requested resource itself.
It won't do either unless the name of the enclosing zipfile ends with
.egg; in such a case all you can use is resource_string or resource_stream.
> The former could be a rather large performance hit in the case
> of py2app. Does anyone have any feedback on the performance of
> using this resource_filename API?
>
>Or is there a better way to do this? Perhaps there is a way to
>force py2app/py2exe to avoid putting Mayavi within the site-packages zipfile?
It would probably be better to extract tvtk_classes.zip to a
directory of the same name, so that instead of having nested
zipfiles, there's only one level of zipping, and you'll just be able
to put the zipped subdirectory on sys.path. (Note that you can put a
subdirectory of a zipfile on sys.path, and it'll still work. It's
just that the subdirectory has to be a directory inside the zipfile,
not another zipfile inside the zipfile.)
More information about the Distutils-SIG
mailing list