[Distutils] pkg_resources.find_distributions("./")

Phillip J. Eby pje at telecommunity.com
Sat Feb 11 17:38:03 CET 2006


At 10:33 AM 2/11/2006 +0100, Elvelind Grandin wrote:
>On 2/11/06, Phillip J. Eby <pje at telecommunity.com> wrote:
> > At 11:14 PM 2/10/2006 +0100, Elvelind Grandin wrote:
> > >On 2/10/06, Phillip J. Eby <pje at telecommunity.com> wrote:
> > > > There is no reliable way to tell what distribution you are in, if 
> all you
> > > > have is the directory name.  If you have a *module* name, however, 
> you can
> > > > use get_provider(modulename).get_metadata('PKG-INFO') to retrieve the
> > > > package's PKG-INFO text, which you can then use to find the 
> distribution
> > > > name and version.
> > > >
> > >
> > >The problem is that the package might not be installed. And
> > >get_provides needs it to be right?
> >
> > The module just needs to be importable.
> >
> >
>
>When I run get_provider("xx") it just seems to return an emtpy
>DefaultProvider instance. there is no egg_name and no metadata.  but I
>can import the package.

Argh.  I forgot about .egg-info distributions; they don't include this 
data, and if there's more than one of them installed in the same directory 
(e.g. site-packages) there is currently no way to tell *which* distribution 
the module is actually from.  I'd have to start including some kind of 
installation manifest in the egg-info and search all of them.  This is 
another fallout from adding system package support that needs to get fixed.

For now, I'd do something like:

     if '.' in modulename:
         top = modulename.split('.')[0]
     else:
         top = modulename
     candidates = []
     for dist in working_set:
         if not module.__file__.startswith(dist.location):
             continue
         if top not in list(dist.get_metadata_lines('top_level.txt')):
             continue
         candidates.append(dist)

This should give you a list of candidate distributions.



More information about the Distutils-SIG mailing list