[Zconfig] Re: [pymon] python eggs and ZConfig

Phillip J. Eby pje at telecommunity.com
Mon Nov 14 11:58:15 EST 2005


At 10:40 AM 11/14/2005 -0500, Fred L. Drake, Jr. wrote:
>On Monday 14 November 2005 09:54, Duncan McGreggor wrote:
>  > Actually, it looks like that's the cache path. So, for some reason,
>  > during the extraction of the egg, the other schema files do not get get
>  > extracted and cached, despite the fact that they are packacked in the
>  > egg. Sounds like this might actually be a question for Phillip Eby, and
>  > maybe not a problem with ZConfig...
>
>It looks like you need to mark those files as "eager resources" or some such;
>I'm not sure of the exact spelling and terminology.

That's certainly an option (eager_resources in setup()).  Of course, if you 
use a custom URL scheme for package-relative files, then you can use 
resource_string or resource_stream instead of resource_filename, and never 
have to unpack the config files to the filesystem in the first place.

PEAK's ZConfig support does this with a 'pkgfile:' URL scheme.  More 
precisely, PEAK's ZConfig support just uses PEAK's URL resolution 
machinery, which includes support for a pkgfile: scheme.  But you could 
also just support pkgfile: URLs natively in ZConfig.  If you're not 
extracting such files to the filesystem, you get the additional advantage 
of being able to do it without the pkg_resources module.

For example:

try:
     from pkg_resources import resource_string
except ImportError:
     def resource_string(module_name, path):
         __import__(module_name)
         module = sys.modules[module_name]
         path = os.path.join(os.path.dirname(module.__file__),*path.split('/'))
         if hasattr(module,'__loader__):
              return module.__loader__.get_data(path)
         else:
              f = open(path,'rb')
              data = f.read()
              f.close()
              return data

(Or the analagous code for resource_stream by wrapping get_data in a StringIO.)

Anyway, if you use this approach with pkgfile: URLs you're basically good 
to go; the rest of ZConfig works beautifully with PEAK's pkgfile: URLs for 
this stuff, although I don't think I've done anything with it since ZConfig 
2.0.

Also - an important point!  If you use resource_string() or 
resource_stream() (or hand-rolled equivalents thereof), your code will work 
with *any* zipfiles, not just eggs!  This is handy for py2exe-packaged 
files.  It's only resource_filename() that needs the full egg runtime 
support, because of the cache directory and the need for unique names 
within it.  If you just use data directly from a zipfile, it's pretty 
simple (as you can see above).



More information about the ZConfig mailing list