
Phillip J. Eby wrote:
At 05:46 PM 11/24/2008 -0500, Mark Sienkiewicz wrote:
As far as I can tell, the *only* purpose of __egginsert is to permit the incorrect behaviour that your patch is intended to fix.
The behavior isn't incorrect; it's by design.
Here is my reasoning for saying it is broken: [banana:~] sienkiew% which python /usr/stsci/pyssg/Python-2.5.1/bin/python [banana:~] sienkiew% ls -l ~/py/lib/python total 8 drwxr-xr-x 38 sienkiew ststaff 1292 Nov 25 10:07 nose -rw-r--r-- 1 sienkiew ststaff 2102 Nov 25 10:07 nose-0.10.4-py2.5.egg-info [banana:~] sienkiew% ls -l /usr/stsci/pyssg/Python-2.5.1/lib/python2.5/site-packages/ total 680 ...unrelated files here... -rw-r--r-- 1 iraf sienkiew 238 Nov 25 10:06 easy-install.pth drwxr-xr-x 5 iraf sienkiew 170 Nov 25 10:06 nose-0.10.0-py2.5.egg -rwxr-xr-x 1 iraf sienkiew 328025 Oct 7 14:57 setuptools-0.6c9-py2.5.egg -rw-r--r-- 1 iraf sienkiew 29 Nov 25 10:06 setuptools.pth [banana:~] sienkiew% setenv PYTHONPATH ~/py/lib/python [banana:~] sienkiew% python 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 nose nose.__version__ '0.10.0' nose.__file__ '/usr/stsci/pyssg/Python-2.5.1/lib/python2.5/site-packages/nose-0.10.0-py2.5.egg/nose/__init__.pyc'
For example, in this case, if someone wanted to offer a patch that changed the behavior in such a way that the added eggs came directly before the sys.path directory in which they were contained, but not
Look what happened: When I imported "nose", it chose the nose from the system site-packages directory, even though I have a different version that occurs earlier on PYTHONPATH. At this time, I would like to draw your attention to http://www.python.org/doc/2.5.2/tut/node8.html section 6.1.2, where it describes PYTHONPATH. "When PYTHONPATH is not set, or when the file is not found there, the search continues in an installation-dependent default path". That does not appear to be what happened here. It should have found the module that was on PYTHONPATH, not the module that is in the system site-packages. Please explain why you consider this to be the desired behaviour. In a later message, you said: pushed all the way to the beginning of sys.path, that would be an acceptable way to change the behavior. In my comments on zooko's patch:
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);
Does this meet your criterion without breaking anything else? IMHO, this is actually not a great patch because it depends on knowledge that should be private to distutils, but setuptools is already violating that information hiding. (For example, it assumes that it is safe to alter sys.path while distutils is loading the .pth file; I didn't see that documented anywhere, but we can see that it works.) b.t.w. You could make easy_install.pth read: import setuptools; setuptools.prep_sys_path() module-name.egg import setuptools; setuptools.alter_sys_path() and then patches to the first/last line would be easier -- they would just happen when you install a new setuptools. Mark S.