[Distutils] patch: solving the two major things that people dislike about setuptools, part 1
Mark Sienkiewicz
sienkiew at stsci.edu
Mon Nov 24 23:46:54 CET 2008
zooko wrote:
> Folks:
>
> There are two things that cause a lot of people to object to the use
> of setuptools: that it changes the semantics of PYTHONPATH, making it
> impossible to override packages on the command-line, and that it
> doesn't work when you run "setup.py install --prefix=./some_dir".
This is #1 on my list of why I hate setuptools. I actually had it
installed (we were wondering if we should distribute our software with
setuptools), but I removed it when I found out that it broke PYTHONPATH.
I have a question about this patch, though:
It is somewhat awkward to apply your patch because setuptools is
distributed and installed as a .egg file. Rather than trying to figure
out how to apply a patch inside a .egg file, I tried to see what the
effect on easy_install.pth would be. I changed my easy_install.pth file
to look like this:
import sys; sys.__plen = len(sys.path)
import sys; print "egg insert at",sys.__egginsert
./nose-0.10.4-py2.5.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:];
p=getattr(sys,'__egginsert',len(os.environ.get('PYTHONPATH','').split(os.pathsep)));
sys.path[p:p]=new; sys.__egginsert = p+len(new)
I think that this is what your patch would do, except for the debugging.
In my testing, I found that this easy_install.pth file behaves exactly
the same as the old one. That is because sys.__egginsert exists and is
always 0; the value you get from looking at the environment is never
used. You can verify this from the print statement I included in the
.pth file:
[banana:~] sienkiew% python
egg insert at 0
Python 2.5.1 (r251:54863, Mar 18 2008, 11:29:59)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import setuptools ; setuptools.__version__
'0.6c9'
Have I understood your patch correctly? Do you have different behaviour
on your system?
I think the correct behaviour is to insert the .egg file either just
before or just after the directory where we found the .pth file.
So, instead of
p=getattr(sys,'__egginsert',len(os.environ.get('PYTHONPATH','').split(os.pathsep)));
we want
p=sys.path.index(sitedir);
We can eliminate __egginsert from the code entirely. As far as I can
tell, the *only* purpose of __egginsert is to permit the incorrect
behaviour that your patch is intended to fix.
Does that make sense to you?
Mark S.
More information about the Distutils-SIG
mailing list