summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xEasyInstall.txt64
-rwxr-xr-xsetuptools.txt2
-rw-r--r--setuptools/command/bdist_egg.py6
-rwxr-xr-xsetuptools/command/easy_install.py22
4 files changed, 49 insertions, 45 deletions
diff --git a/EasyInstall.txt b/EasyInstall.txt
index c310bd88..0539d8cc 100755
--- a/EasyInstall.txt
+++ b/EasyInstall.txt
@@ -673,15 +673,22 @@ Non-Root Installation
If you want to use EasyInstall on a computer where you do not have write access
to Python's main ``site-packages`` directory, you may need to set up an
-alternate ``PYTHONHOME`` location, which allows Python to read a second
-``site-packages`` directory.
+alternate "home" location for Python, so that it uses a personal
+``site-packages`` directory instead of the system-wide ``site-packages``.
If you are on a Mac OS X machine, you should just use the
``~/Library/Python2.x/site-packages`` directory (replacing the ``x`` with the
appropriate number). Just make sure the directory exists, and use it as your
-installation location for all packages (including EasyInstall itself). You
-do not need to set up a ``PYTHONHOME``, so you can skip the rest of this
-section, unless you want to be able to override system-installed packages.
+installation location for all packages (including EasyInstall itself). To
+make the distutils install to this personal ``site-packages`` directory by
+default, you should create a ``~/.pydistutils.cfg`` file with the following
+contents::
+
+ [install]
+ install_lib = ~/Library/Python$py_version_short/site-packages
+
+This will tell the distutils (and EasyInstall) to always install packages in
+the appropriate personal ``site-packages`` directory.
If you are on a Linux, BSD, Cygwin, or other similar Unix-like operating
system, you should create a ``~/lib/python2.x/site-packages`` directory
@@ -694,39 +701,40 @@ instead. You will need to know your Python version's ``sys.prefix`` and
Assuming your ``sys.prefix`` is ``/usr/local``, and you are working with
Python 2.4, you need to then perform the following steps (possibly making
-adjustments for the tools available on your platform)::
+adjustments for the tools available on your platform). First, you need
+to set up the local library directories, by symlinking to the system Python's
+libraries::
+
+ mkdir -p ~/lib/python2.4
+ ln -s /usr/local/lib/python2.4/* ~/lib/python2.4/
+ rm ~/lib/python2.4/site-packages
+ mkdir ~/lib/python2.4/site-packages
+ ln -s /usr/local/lib/python2.4/site-packages/* ~/lib/python2.4/site-packages
- cd /usr/local/lib/python2.4
- find . -name lib-dynload -prune -o -name site-packages -prune -o \
- -print >~/pyfiles
- zip -r ~/lib/python24.zip . -i@$HOME/pyfiles
- rm ~/pyfiles
- mkdir -p ~/lib/python2.4/site-packages
- ln -s /usr/local/lib/python2.4/lib-* ~/lib/python2.4/
+If your ``sys.exec_prefix`` was different from your ``sys.prefix``, you will
+also need to do this::
- echo "[install]" >>~/.pydistutils.cfg
- echo "prefix=$HOME" >>~/.pydistutils.cfg
- echo "exec_prefix=$HOME" >>~/.pydistutils.cfg
+ ln -s /execprefix/lib/python2.4/* ~/lib/python2.4/
-Note that all of the paths above should be based on ``sys.prefix``, not
-``sys.exec_prefix`` (unless they're the same). Once these one-time steps are
-completed, you can set your ``PYTHONHOME`` with::
+replacing ``execprefix`` in the above with the value of ``sys.exec_prefix``.
- export PYTHONHOME=$HOME:/old_exec_prefix
+Finally, you will also need a private ``python`` executable, e.g.::
-replacing ``/old_exec_prefix`` with the original value of ``sys.exec_prefix``.
+ mkdir -p ~/bin
+ ln /usr/local/bin/python2.4 ~/bin/python
-The downside to this setup is that it can take up as much as 10 megabytes of
-disk space to store the zipped standard library. The upside, however, is that
-Python usually starts much faster with a zipped standard library! And of
-course, you'll effectively have complete control over your own Python
-installation, without needing to convince a system administrator to install
-packages for you.
+Note that if hardlinking as shown doesn't work (e.g. because the system Python
+is on a different filesystem), you should use ``copy -p`` instead of ``ln``.
+Do NOT use a symlink; the Python binary must be copied or hardlinked, otherwise
+it will use the system ``site-packages`` directory and not yours.
Note that if you were previously setting a ``PYTHONPATH`` and/or had other
special configuration options in your ``~/.pydistutils.cfg``, you may need to
remove these settings, after relocating any older installed modules to your
-new ``~/lib/python2.x`` directory.
+new ``~/lib/python2.x/site-packages`` directory. Also note that you must now
+make sure to use the ``~/bin/python`` executable instead of the system Python,
+and ideally you should put ``~/bin`` first on your ``PATH`` as well, because
+that is where EasyInstall will install new Python scripts.
Release Notes/Change History
diff --git a/setuptools.txt b/setuptools.txt
index ae2ead21..b7631033 100755
--- a/setuptools.txt
+++ b/setuptools.txt
@@ -10,7 +10,7 @@ Packages built and distributed using ``setuptools`` look to the user like
ordinary Python packages based on the ``distutils``. Your users don't need to
install or even know about setuptools in order to use them, and you don't
have to include the entire setuptools package in your distributions. By
-including just a single `bootstrap module`_ (a 5K .py file), your package will
+including just a single `bootstrap module`_ (a 7K .py file), your package will
automatically download and install ``setuptools`` if the user is building your
package from source and doesn't have a suitable version already installed.
diff --git a/setuptools/command/bdist_egg.py b/setuptools/command/bdist_egg.py
index 1f17bb82..0c5fae43 100644
--- a/setuptools/command/bdist_egg.py
+++ b/setuptools/command/bdist_egg.py
@@ -168,14 +168,11 @@ class bdist_egg(Command):
# We run install_lib before install_data, because some data hacks
# pull their data path from the install_lib command.
-
log.info("installing library code to %s" % self.bdist_dir)
instcmd = self.get_finalized_command('install')
- old_root = instcmd.root
- instcmd.root = None
+ old_root = instcmd.root; instcmd.root = None
cmd = self.call_command('install_lib', warn_dir=0)
instcmd.root = old_root
-
ext_outputs = cmd._mutate_outputs(
self.distribution.has_ext_modules(), 'build_ext', 'build_lib', ''
)
@@ -201,7 +198,6 @@ class bdist_egg(Command):
archive_root = self.bdist_dir
egg_info = os.path.join(archive_root,'EGG-INFO')
self.mkpath(egg_info)
-
if self.distribution.scripts:
script_dir = os.path.join(egg_info, 'scripts')
log.info("installing scripts to %s" % script_dir)
diff --git a/setuptools/command/easy_install.py b/setuptools/command/easy_install.py
index 3f754af6..db865e80 100755
--- a/setuptools/command/easy_install.py
+++ b/setuptools/command/easy_install.py
@@ -104,8 +104,10 @@ class easy_install(Command):
for filename in blockers:
log.info("Deleting %s", filename)
if not self.dry_run:
- if os.path.isdir(filename):
- shutil.rmtree(filename)
+ if hasattr(os.path,'islink') and os.path.islink(filename):
+ os.unlink(filename)
+ elif os.path.isdir(filename):
+ shutil.rmtree(filename)
else:
os.unlink(filename)
@@ -119,8 +121,6 @@ class easy_install(Command):
-
-
def finalize_options(self):
# If a non-default installation directory was specified, default the
# script directory to match it.
@@ -846,7 +846,9 @@ See the setuptools documentation for the "develop" command for more info.
if dist.key=='setuptools':
# Ensure that setuptools itself never becomes unavailable!
# XXX should this check for latest version?
- f = open(os.path.join(self.install_dir,'setuptools.pth'), 'wt')
+ filename = os.path.join(self.install_dir,'setuptools.pth')
+ unlink_if_symlink(filename)
+ f = open(filename, 'wt')
f.write(dist.location+'\n')
f.close()
@@ -857,8 +859,6 @@ See the setuptools documentation for the "develop" command for more info.
return dst # only unpack-and-compile skips files for dry run
-
-
def unpack_and_compile(self, egg_path, destination):
to_compile = []
@@ -1017,9 +1017,9 @@ def extract_wininst_cfg(dist_filename):
f.close()
-
-
-
+def unlink_if_symlink(filename):
+ if hasattr(os.path,'islink') and os.path.islink(filename):
+ os.unlink(filename)
@@ -1100,11 +1100,11 @@ class PthDistributions(Environment):
if self.dirty:
log.debug("Saving %s", self.filename)
data = '\n'.join(self.paths+[''])
+ unlink_if_symlink(self.filename)
f = open(self.filename,'wt'); f.write(data); f.close()
self.dirty = False
-
def add(self,dist):
"""Add `dist` to the distribution map"""
if dist.location not in self.paths: