How to deal with "Not uninstalling pip at /usr/lib/python2.7/dist-packages, owned by OS"
When system-wide pip turns out too old (e.g. for lacking support for pip
check
), one may end up trying to update pip using a command like:
sudo pip install --upgrade pip
That's likely to end up with this message:
Not uninstalling pip at /usr/lib/python2.7/dist-packages, owned by OS
That non-error and the confusion that easily happens right after is why I'm writing this post. So let's look at the whole thing in a bit more context on a shell, a Debian jessie one in this case:
# cat /etc/debian_version 8.10 # pip install --upgrade pip ; echo $? Downloading/unpacking pip from https://pypi.python.org/packages/b6[..]44 Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB): 1.3MB downloaded Installing collected packages: pip Found existing installation: pip 1.5.6 Not uninstalling pip at /usr/lib/python2.7/dist-packages, owned by OS Successfully installed pip Cleaning up... 0 # pip --version pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)
Now the interesting part is that it looks like pip would not have been
updated. That impression is false : Latest pip has been installed
successfully (to /usr/local/bin
). One of two things is going on here:
a) Unexpected Path resolution order You have /usr/bin/
before
/usr/local/bin/
in $PATH
, e.g. as with root of Debian jessie, so that the
new pip has no chance of winning the race of path resolution for pip
. For
example:
# sed 's,:,\n,g' <<<"$PATH" /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin /opt/bin /usr/lib/llvm/5/bin /usr/lib/llvm/4/bin
b) Location hashing at shell level Your shell has hashed the old location of
pip
(as Bash would do) and "hides" the new version from you in the current
shell session. To see that in action, we utilize Bash builtins type
and
hash
:
# type pip pip is hashed (/usr/bin/pip) # pip --version pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7) # hash -d pip # type pip pip is /usr/local/bin/pip # pip --version pip 9.0.1 from /usr/local/lib/python2.7/dist-packages (python 2.7)
So in either case you can run a recent pip from /usr/local/bin/pip
right
after pip install --upgrade pip
, no need to resort to
get-pip.py
or so, in fact.