[Distutils] Disabling --single-version-externally-managed

Phillip J. Eby pje at telecommunity.com
Sat Sep 1 20:07:57 CEST 2007

At 09:20 PM 8/31/2007 -0700, Toshio Kuratomi wrote:
>Just to illustrate what I'm trying to achieve.  I've updated the Fedora
>Packaging Guidelines[1]_ to allow two versions of a package to coexist.
>  I'll list here the sqlalchemy-0.4 and -0.3 build steps, filelists, and
>the output of the test-sql.sh script using this procedure.  The end
>result is what we want but the build step to get there seem a tad
>fragile and kludgey.  Since these are going to become guidelines for all
>of our python packages, I'd like to know if either: 1) there's a better
>way to do this or 2) the results I'm achieving are not expected and
>could disappear with a random upgrade of setuptools.
>.. _[1]: http://fedoraproject.org/wiki/PackagingDrafts/PythonEggs

Here's the thing: if you want multiple installed versions of a 
package, *and* you want there to be a default version, then you 
*have* to have easy_install (or zc.buildout, or some similar tool) 
generate the startup scripts for anything that wants to use a 
non-default version.

This is true irrespective of the formats of the versions involved, 
whether they're zipfiles, directories, single-version, or 
whatever.  It's just the nature of the beast, due to the fact that 
there is a global 'working_set' that lists the projects that are 
currently on sys.path, and it is initialized when pkg_resources is 
imported.  (And currently, there is no way to *remove* a distribution 
from the working set.)

Thus, if you want multiple versions *and* want to be able to select a 
version after pkg_resources has been imported, you *cannot* have a 
default version.  In other words, the egg must not be on sys.path 
when pkg_resources is imported.  Then, pkg_resources can locate the 
desired version and add it.

(By the way: "on sys.path" means, "is importable", not "is in a 
directory on sys.path".  An .egg file or directory in site-packages 
is not "on sys.path" unless its filename is actually listed in 
sys.path.  A single-version egg in site-packages, however, *is* on sys.path).

More information about the Distutils-SIG mailing list