python, change user site directory or install setup.py --prefix with --user

rudimeier picture rudimeier · Jun 26, 2014 · Viewed 7.7k times · Source

I'd want to install python modules as non-root user like this

$ pip install -I --install-option="--prefix=~/usr" scipy

Unfortunately this usually does not work unless you specify --user. But --user can't be used together with --prefix. Using --user only (without --prefix) installs to ~/.local which I find ugly because I have a well maintained ~/usr and don't want to add even more stuff to my env to make ~/.local usable too.

So my questions:

  1. How can I let --prefix and --user work together for setup.py or how else could setup.py succeed without using --user?
  2. Or can I change the user site directory from ~/.local to ~/usr somehow by env?

Answer

Piotr Dobrogost picture Piotr Dobrogost · Jun 26, 2014

To answer your first question:

In Installing Python Modules guide written by Greg Ward we read:

Note that the various alternate installation schemes are mutually exclusive: you can pass --user, or --home, or --prefix and --exec-prefix, or --install-base and --install-platbase, but you can’t mix from these groups.

To answer your second question:

In the same guide there's section Alternate installation: the user scheme where we read:

Files will be installed into subdirectories of site.USER_BASE

with site.USER_BASE linked to https://docs.python.org/2/library/site.html#site.USER_BASE. There we are asked to see also information on PYTHONUSERBASE environment variable:

Defines the user base directory, which is used to compute the path of the user site-packages directory and Distutils installation paths for python setup.py install --user.

Also, you might be interested in the home scheme:

The idea behind the “home scheme” is that you build and maintain a personal stash of Python modules. This scheme’s name is derived from the idea of a “home” directory on Unix, since it’s not unusual for a Unix user to make their home directory have a layout similar to /usr/ or /usr/local/.