[Distutils] Working environment

Ian Bicking ianb at colorstudy.com
Tue Mar 7 19:01:55 CET 2006


So, coming back to the idea of a working environment, an isolated and 
more-or-less self-contained environment for holding installed packages. 
  Sorry if this is a little scattered.  I'm just summarizing my thoughts 
and the open issues I see, in no particular order (because I'm not sure 
what order to approach these things in).

I'm assuming such an environment will be encapsulated in a single 
directory, looking something like:

env/
   bin/
   lib/python2.4/
   src/
   conf/

The conf/ directory doesn't really relate to much of this specifically, 
but in many situations it would be useful.  Depending on the situation, 
other subdirectories may exist.

Each of the scripts in bin/ should know what their working environment 
is.  This is slightly tricky, depending on what that means.  If it is a 
totally isolated environment -- no site-packages on sys.path -- then I 
feel like the script wrappers have to be shell scripts, to invoke Python 
with -S (which is hard to do portably on the #! line).  I don't know the 
details of doing the same thing on Windows, but I assume it is possible. 
  The actual directory location should be portable -- all paths should 
be relative, and you should be able to move the directory around.

lib/python2.4/ is for packages.  I'm almost inclined to say that 
--single-version-externally-managed makes sense on some level, with a 
record kept in some standard place (lib/python2.4/install-record.txt?) 
-- but I'm basically indifferent.  I at least don't see a need for 
multiple simultaneous versions in this setup, and multiple versions do 
lead to confusion.  Version metadata is still nice, of course.

src/ is for checkouts, where each package is installed with setup.py 
develop.  These are naturally single-version, which is part of why I 
like the idea of only using single-version setups.  I'm a little unsure 
of how src/ should be layed out.  In practice I want all "my" packages 
to be installed in src/ as checkouts, either from tags or the trunk (or 
a branch or whatever).  So I'm not sure if I should name the 
subdirectories after the package, or maybe even the package plus a tag 
name.

One of the things SwitchTower (now "Cappucino", I think) does in Rails 
land is it makes a dated checkout, then activates that checkout (it does 
it with a symlink, we'd do it with setup.py develop).  It then rolls 
back by switching to an existing checkout.  Of course svn switch + svn 
up does this in place, and with less checkout trash laying around, even 
if rollbacks aren't as fast as a result.  So, I'm thinking just 
src/PackageName/

There's an installation issue there -- it would be nice if I could say 
"these are the packages I want to install as editable" and easy_install 
would pick those up (maybe detecting based on what package index the 
package was found in) and install them in src/ as editable.

sys.path would contain /usr/lib/python2.4, optionally 
/usr/lib/python2.4/site-packages, and env/lib/python2.4/, and all the 
similar directories.  Unfortunately figuring out what "similar" 
directories there are is hard.  sys.path on my machine now has 63 
entries normally and 12 with python -S.  I guess I'd really like to 
start with 12 and build up, instead of 63 and try to strip them down.

Installation as a whole is an open issue.  Putting in env/setup.cfg with 
the setting specific to that working environment works to a degree -- 
easy_install will pick it up if invoked from there.  But that doesn't 
work with setup.py develop, or setup.py install, or some other 
scenarios.  The system distutils.cfg doesn't really work, because the 
only expansion it knows how to do is of user directories, so there's 
little way to pass interesting information in (like a "this is my 
setup.cfg" environmental variable or something).  Maybe with PYTHONPATH 
to indicate the working environment, and a distutils monkeypatch put 
into lib/python2.4/distutils/__init__.py?  I played around with putting 
the path setup in sitecustomize, but that runs after site.py, and 
doesn't run at all if python -S is used, so it seems like it brings in 
too much before it can remove stuff.

Another option is a completely new python interpreter bound to the 
environment.  Basically the virtual-python.py option 
(http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python). 
  In this model using env/bin/python indicate the proper environment, 
and you'd have local installs of *everything* including easy_install. 
This fixes so many problems without crazy hacks that it strongly appeals 
to me, especially if we can make it somewhat lighter.  I get this 
/usr/lib/python2.4.zip on my path, that doesn't usually exist (does it 
ever get created by default); if we could create that somehow on demand 
and use such a big-bundle-zip, that seems lighter and faster and nicer. 
  If we just put .pyc files in it, and those .pyc files refer back to 
the actual module source (in /usr/lib/python2.4/), then tracebacks 
should also still work, right?  No actual symlinks either, so it should 
work on Windows.  I'm not entirely sure where I'm going with this, though.

Sorry for the length.  I've been stewing on this without a lot of 
progress since PyCon so I thought I'd just throw out my current 
thoughts.  Maybe what I really want to do is hack on virtual-python.py 
some more and see where that gets me.

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


More information about the Distutils-SIG mailing list