[Catalog-sig] [Distutils] pre-PEP : Synthesis of previous threads, and irc talks + proposals

Ian Bicking ianb at colorstudy.com
Tue Oct 7 21:07:35 CEST 2008


Tarek Ziadé wrote:
> On Tue, Oct 7, 2008 at 2:42 PM, Phillip J. Eby <pje at telecommunity.com> wrote:
>> At 10:07 AM 10/7/2008 -0400, Tarek Ziadé wrote:
>>> The -m feature of setuptools is nice, but it activates one version at
>>> a time, and
>>> this is globlal to Python unless each application is handling the
>>> version switch,
>>> wich is pretty heavy.
>> With or without the -m switch, scripts installed by setuptools will find the
>> version they are specified to use, without the user needing to do anything.
>>  So, you can have a default version of an egg (used by the interpreter and
>> non-setuptools scripts), and then some non-default versions that are used by
>> scripts.
>>
>> zc.buildout and virtualenv also have their own ways of accomplishing the
>> same thing, e.g., by hardcoding paths in an installed script.
> 
> in a plain python setup,
> 
> If foo 1.2 is the default, and a package wants use foo 1.4,
> it needs to specifically call pkg_resources.require() in the code, to
> activate it in sys.path
> before importing "foo" in the code.
> 
> Since each package can list with setuptools its dependencies with
> versions in install_requires,
> how hard  would it be to automatically call the right "require()"
> calls when the package is used ?

require() is recursive, so as long as the original script is explicitly 
loaded (e.g., from a binary script, or something that loads eggs/entry 
points) then the proper versions will be loaded.  Though as far as I 
know, pkg_resources won't remove other versions of the egg from the 
path, so it only works if there are no active versions of the eggs. 
Which isn't how many people install packages, so this feature of 
require() doesn't get used for much of anything (at least that I've seen).

I'll also note that the require in setuptools-generated scripts causes 
pretty frequent problems for people, all to support this multi-version 
feature that no one really uses.

An example of an easy way to cause the problem, if you do: "python 
setup.py develop; svn up; python setup.py egg_info" it'll break any 
scripts, or if you install a script in an unusual location, or use 
$PYTHONPATH but don't set $PATH so that you get an unexpected script 
that doesn't match your libraries -- since pyinstall is using 
--single-version-externally-managed, I kind of wish I could easily turn 
off the require() as well (I could monkeypatch setuptools to remove it, 
but I've been burned by going down that path before).


-- 
Ian Bicking : ianb at colorstudy.com : http://blog.ianbicking.org


More information about the Catalog-SIG mailing list