[Catalog-sig] [Distutils] pre-PEP : Synthesis of previous threads, and irc talks + proposals
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
>> 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