Combine --user with --prefix error with setup.py install
As has been noted in the comments, the accepted answer (by @gotgenes, who, presumably, has genes) can lead to unexpected consequences.
@rogeleaderr says, "Note that keeping this file like this will make Python think that / is your root python library directory, leading to confusing issues if you try to install other new packages."
Rather than write a new config file, as @gotgenes recommends, a better option is to add --prefix=
(with no text to the right of the equals sign) as an option on the command line, as in
$ python setup.py install --user --prefix=
One time workaround:
pip install --user --install-option="--prefix=" <package_name>
or
python setup.py install --user --prefix=
Note that there is no text (not even whitespace) after the =
.
Do not forget the --user
flag.
Installing multiple packages:
Create ~/.pydistutils.cfg
(or equivalent for your OS/platform) with the following contents:
[install]
prefix=
Note that there is no text (not even whitespace) after the =
.
Then run the necessary pip install --user
or python setup.py install --user
commands. Do not forget the --user
flag.
Finally, remove or rename this file. Leaving this file present will cause issues when installing Python packages system-wide (i.e., without --user
) as this user with this ~/.pydistutils.cfg
.
The cause of this issue
This appears to be an issue with both OpenSUSE and RedHat, which has lead to a bug in virtualenv on these platforms.
The error stems from a system-level distutils configuration file (in my case /usr/lib64/python2.6/distutils/distutils.cfg
) where there was this
[install]
prefix=/usr/local
Basically, this is equivalent to always running the install command as install --prefix=/usr/local
. You have to override this specification using one of the techniques above.
Posting to save others time, as no available answers worked for me...
In some environments, using the --target
(-t
) switch will still hit the same error. In my testing on two flavors of linux, I encountered the same issue when using the --prefix=
parameter.
Code:
PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE
Explanation:
My workaround, which seems to work across many environments (MacOS, Amazon Linux, Debian) is to set the PYTHONUSERBASE
environment variable to a temp location. --force-reinstall
is used to trigger the local installation even when the package is already installed.
This will result in the module being compiled/installed (depending on the OS and Python version) to: /tmp/lib/python2.7/site-packages/*