[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