Re: [Distutils] setuptools: bug in run_script

At 01:00 PM 9/25/2005 -0500, Ian Bicking wrote:
Ben Bangert encountered a problem where pkg_resources.WorkingSet.run_script didn't work; from line 407:
self.require(requires)[0].run_script(script_name, ns)
If all the packages are already loaded for some reason, then self.require() returns [].
I don't really understand how we got in this state -- that apparently packages are available before they are being required.
That's actually normal, for packages that are already on sys.path (via easy-install.pth). What's not normal is that require() should never return []. As it turns out, it's a bug in an optimization I added for 0.6a3 that avoids creating an Environment if all requirements can be satisfied from the working set. It ends up not adding the relevant packages to the list it returns. Here's a patch to fix it until I get a bugfix release out: Index: pkg_resources.py =================================================================== RCS file: /cvsroot/python/python/nondist/sandbox/setuptools/pkg_resources.py,v retrieving revision 1.72 diff -u -r1.72 pkg_resources.py --- pkg_resources.py 24 Sep 2005 19:48:28 -0000 1.72 +++ pkg_resources.py 25 Sep 2005 18:57:07 -0000 @@ -463,7 +463,7 @@ requirements = list(requirements)[::-1] # set up the stack processed = {} # set of processed requirements - best = dict([(d.key,d) for d in self]) # key -> dist + best = {} # key -> dist to_activate = [] while requirements: @@ -471,20 +471,20 @@ if req in processed: # Ignore cyclic or redundant dependencies continue - dist = best.get(req.key) if dist is None: # Find the best distribution and add it to the map - if env is None: - env = Environment(self.entries) - dist = best[req.key] = env.best_match(req, self, installer) + dist = self.by_key.get(req.key) if dist is None: - raise DistributionNotFound(req) # XXX put more info here + if env is None: + env = Environment(self.entries) + dist = best[req.key] = env.best_match(req, self, installer) + if dist is None: + raise DistributionNotFound(req) # XXX put more info here to_activate.append(dist) elif dist not in req: # Oops, the "best" so far conflicts with a dependency raise VersionConflict(dist,req) # XXX put more info here - requirements.extend(dist.requires(req.extras)[::-1]) processed[req] = True
participants (1)
-
Phillip J. Eby