diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index da251dc4e8396192080e2459eba47e79bf3f3a93..8504b96fcf5cd27571b5dbac2f26e83b0027f2a1 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -783,6 +783,12 @@ def do_install(self, **kwargs):
                 self.stage.chdir_to_source()
                 build_env.setup_package(self)
 
+                # Allow extendees to further set up the environment.
+                for ext_name in self.extendees:
+                    ext_spec = self.spec[ext_name]
+                    ext_spec.package.setup_extension_environment(
+                        self.module, ext_spec, self.spec)
+
                 if fake_install:
                     self.do_fake_install()
                 else:
@@ -854,6 +860,30 @@ def module(self):
                           fromlist=[self.__class__.__name__])
 
 
+    def setup_extension_environment(self, module, spec, ext_spec):
+        """Called before the install() method of extensions.
+
+        Default implementation does nothing, but this can be
+        overridden by an extendable package to set up the install
+        environment for its extensions.  This is useful if there are
+        some common steps to installing all extensions for a
+        certain package.
+
+        Some examples:
+
+        1. Installing python modules generally requires PYTHONPATH to
+           point to the lib/pythonX.Y/site-packages directory in the
+           module's install prefix.  This could set that variable.
+
+        2. Extensions often need to invoke the 'python' interpreter
+           from the Python installation being extended.  This routine can
+           put a 'python' Execuable object in the module scope for the
+           extension package to simplify extension installs.
+
+        """
+        pass
+
+
     def install(self, spec, prefix):
         """Package implementations override this with their own build configuration."""
         raise InstallError("Package %s provides no install method!" % self.name)
diff --git a/var/spack/packages/py-setuptools/package.py b/var/spack/packages/py-setuptools/package.py
index e2c4e1a0be6be68ce1e072fd15a08474b147a309..755288d55c3d0108c8afaf8fddc6c38300757351 100644
--- a/var/spack/packages/py-setuptools/package.py
+++ b/var/spack/packages/py-setuptools/package.py
@@ -10,10 +10,4 @@ class PySetuptools(Package):
     extends('python')
 
     def install(self, spec, prefix):
-        site_packages_dir = "%s/lib/python2.7/site-packages" % prefix
-        mkdirp(site_packages_dir)
-
-        env['PYTHONPATH'] = site_packages_dir
-
-        python = which('python')
         python('setup.py', 'install', '--prefix=%s' % prefix)
diff --git a/var/spack/packages/python/package.py b/var/spack/packages/python/package.py
index 953be69cc23cfe92f6db8b9798d8fd0bde4fc8f9..9700179ab8e3b729932645485afc99efdca8d104 100644
--- a/var/spack/packages/python/package.py
+++ b/var/spack/packages/python/package.py
@@ -1,5 +1,5 @@
 from spack import *
-
+import os
 
 class Python(Package):
     """The Python programming language."""
@@ -26,3 +26,24 @@ def install(self, spec, prefix):
                   "--enable-shared")
         make()
         make("install")
+
+
+    def setup_extension_environment(self, module, spec, ext_spec):
+        """Called before python modules' install() methods.
+
+        In most cases, extensions will only need to have one line::
+
+            python('setup.py', 'install', '--prefix=%s' % prefix)
+        """
+        # Python extension builds can have a global python executable function
+        module.python = Executable(join_path(spec.prefix.bin, 'python'))
+
+        # Add variables for lib/pythonX.Y and lib/pythonX.Y/site-packages dirs.
+        module.python_lib_dir = join_path(ext_spec.prefix.lib, 'python%d.%d' % self.version[:2])
+        module.site_packages_dir = join_path(module.python_lib_dir, 'site-packages')
+
+        # Add site packages directory to the PYTHONPATH
+        os.environ['PYTHONPATH'] = module.site_packages_dir
+
+        # Make the site packages directory if it does not exist already.
+        mkdirp(module.site_packages_dir)