[Distutils] patch: solving the two major things that people dislike about setuptools, part 1
Mark Sienkiewicz
sienkiew at stsci.edu
Tue Nov 25 16:56:33 CET 2008
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'
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:
>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
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.
More information about the Distutils-SIG
mailing list