
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.