[Distutils] Multiple version support (default installs and plugins)
Phillip J. Eby
pje at telecommunity.com
Fri Dec 23 01:25:59 CET 2005
At 11:38 PM 12/22/2005 +0100, M.-A. Lemburg wrote:
>How do you assure that only one version of the package
>gets loaded into the Python process ?
I went back in the time machine and convinced Guido to make the import
system only load the first module it finds with a given name. ;-)
Sorry, couldn't resist. :)
>If you use a module A that needs version 1 and at the
>same time a module B that requires version 2, how will
>this conflict get resolved ?
pkg_resources.VersionConflict is raised at the point of require()-ing
something that conflicts with something already in the working set.
Note that you might not get a conflict if module A accepts versions >=1,
and B accepts versions >=2, and you have version 2, and it's the default
version or was requested by the __main__ program, effectively making it the
default.
For example, TurboGears specifies requirements for certain modules that are
also depended on by its dependencies. I don't remember what they are, but
for the sake of example I'll say that TurboGears depends on a particular
version of FormEncode, which is also depended on by SQLObject - which
TurboGears also requires. So it's something like this:
TurboGears:
FormEncode>=0.5dev
SQLObject>=0.8dev
SQLObject:
FormEncode>=0.4
If you run a TurboGears-requiring script, it's going to request a newer
FormEncode, which will then become the default. SQLObject also gets
processed for dependencies, since TurboGears requires it, but since the
default (FormEncode>=0.5dev) is compatible with the SQLObject requirement
(FormEncode>=0.4), life just goes on with no conflict.
There are currently a few issues with this algorithm, mainly that it
decides on a "default version" too early; as soon as pkg_resources is
finished importing, all "default versions" for eggs that are already
importable on sys.path are established and can't be changed. In 0.7, I'll
be doing some work to loosen this so that the default version of a project
won't be set in stone until an explicit choice is made or until the default
default version has been imported.
>If you find this feature important enough, shouldn't we
>try to get a solution into the standard Python import
>mechanism rather than playing tricks with sys.path ?
"Playing tricks with sys.path" *is* the standard way to do it; just look at
what Guido answers every time anybody asks about needing specific versions
of things. "The application should just set up its sys.path however it
needs to" is more or less his standard response. The pkg_resources module
just provides you with convenient routines to do what Guido has already
declared to be the One Obvious Way to do it, i.e. sys.path manipulation.
More information about the Distutils-SIG
mailing list