Re: [Distutils] Parsing setup()
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.chdir(setup_dir) 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. :)
participants (1)
-
Phillip J. Eby