[Distutils] Parsing setup()

Phillip J. Eby pje at telecommunity.com
Tue Jun 5 01:22:11 CEST 2007

At 03:58 PM 6/4/2007 -0700, Rob wrote:
>Ian Bicking wrote:
> > If you have a built egg (which you can do with python setup.py 
> egg_info, without actually installing
> > anything) you can read the requires.txt file with pkg_resources.
>I had tried that but I was having problems with un-installed packages.
>I have this so far, which works with *nux, but I'll have to figure out
>how to find the correct Python
>executable in Windows (I think using different Python versions could
>yield different requirements?).
>pkg_name = "pycopia-net"
>os.system("/usr/bin/env python %s egg_info" % setup_file)

If you use "-e sometmpdir" as an option, you can have the .egg-info 
put in a temporary directory with a known location.  You need this 
because some package layouts don't have the .egg-info in the package 
root, so the rest of your stuff won't work.

To be honest, though, I think you're going to way too much trouble 
here.  Just what exactly is the use case here?  Couldn't you just 
easy_install the package to a temporary directory with 
--no-deps?  Why do you think you need to inspect the setup.py in the 
first place?

By the way, your code here is broken even on *nux systems if the user 
runs your tool with a different Python than the system 
one.  sys.executable gives you the full path to the currently-running 
version of Python, irrespective of platform.

(You might also want to consider using the 
setuptools.sandbox.run_setup() function instead of os.system.)

>ws = WorkingSet(setup_dir)
>env = Environment()
>dist = env.best_match(Requirement.parse(pkg_name), ws)
>print dist.get_metadata("requires.txt").split()
>['pycopia-process>=0.9', 'pycopia-utils>=0.9']

Just use dist.requires() here, and then you won't be dependent on 
internal details of the format.

In general, I would suggest that trying to work your way around 
setuptools' APIs is a very bad idea.  More often than not, you will 
miss one of the nine jillion supported configurations and thus will 
end up with a tool that only works on your system...  *sometimes*.

Case in point: your code above depends on the .egg-info being in the 
setup directory, which is often not the case.  Zope packages, for 
example, usually have a src/ or lib/ subdirectory that will be where 
the egg-info is.  Other packages may have it in other places, perhaps 
even more deeply nested.

Pretty much *any* place where you are reading a file format directly 
or looking at directory contents yourself, you're probably breaking 
something that setuptools has encapsulated for a Very Good 
Reason.  When in doubt, ask.  :)

More information about the Distutils-SIG mailing list