在Ubuntu下面用pip的时候偶尔会遇到“owned by OS”的问题,这是由于pip和库都是由系统的apt包管理安装所导致的。需要自行安装pip才能升级到最新版本而不是软件源里提供的版本。

在Ubuntu/Debian里用pip更新python库的时候会看到这样的提示:

1
2
3
4
5
6
7
Downloading/unpacking six from https://pypi.python.org/packages/3.3/s/six/six-1.9.0-py2.py3-none-any.whl#md5=9ac7e129a80f72d6fc1f0216f6e9627b
Downloading six-1.9.0-py2.py3-none-any.whl
Installing collected packages: six
Found existing installation: six 1.5.2
Not uninstalling six at /usr/lib/python2.7/dist-packages, owned by OS
Successfully installed six
Cleaning up...

这是由于pip/pip2/pip3和所需要的python库都是通过安装系统软件源中的python-pip以及python3-pip和诸如python-six这样的python库软件包安装的。
为了保证pip的升级不影响软件源对这部分包的管理,Debian为它软件源中的pip打了补丁以阻止pip更新由apt管理的软件包,显示“owned by OS”的提示。

想要解决这个问题也很简单。首先用apt卸载掉系统安装的pip。

1
sudo apt-get purge python-pip python3-pip

然后通过pip官网提供的命令安装pip:

1
2
3
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
sudo python get-pip.py

需要注意的是,如果用Python3执行get-pip.py脚本,它会生成pippip3两个命令,而用Python2执行,会生成pippip2两个命令。
所以根据它们执行的顺序,pip命令会互相覆盖。所以建议先用Python3再用Python2。

当然实际上这两个脚本没有任何区别,只是第一行的shebang会指定解释器是python还是python3。安装一个之后自行拷贝修改也是可以的。

安装之后存在的问题是,原本通过系统软件源安装的python包也会被pip更新,如果之后再用apt更新的话会覆盖掉pip安装/更新的包。
所以建议有需求的话刚安装系统后就手动安装pip,然后一直使用pip管理Python库,不使用apt。