不同的安装方法对 Python packages 的安装路径有着不同的影响。
使用 Linux 发行版自带的 Package Manager 安装
sudo apt install python3-<pkg>
此时 package 被安装在 /usr/lib/python3/dist-packages/。该文件夹由 Linux 发行版管理。root 用户使用 pip3 show 查看已安装的 package 时,也会检索这个目录。因此当 sudo pip3 install 发现 apt 已经安装 package 后,不会再重复安装。
但有这样一种情况,apt 安装的 package 版本较低,root 用户可以使用 pip3 更新它。此时 apt 安装的老版本不会被 pip3 移除。新版本则被安装在 /usr/local/lib/python?.?/dist-packages/ 下。想要删除老版本需使用 sudo apt remove python3-<pkg>。
有了 pip3 Linux 还要在软件源中维护一套 Python packages 的原因是为了稳定。Linux 发行版的系统工具会依赖特定版本的 Python。为了系统的稳定,Linux 发行版会维护支持该版本 Python 的 packages,并把它们加入软件源管理。因此可以使用 apt 安装系统默认 Python 版本对应的 packages。
dist-packages是 Linux 发行版 Debian 定下的名字。
通过 Python 的 Package Manager 安装
[sudo] pip3 install <pkg>
若是 root 用户使用 pip3 安装 package,则安装位置为 /usr/local/lib/python?.?/dist-packages/;若是普通用户安装使用 pip3 安装 package,则安装位置为 ${HOME}/.local/lib/python?.?/site-packages/。
不同用户使用 pip3 安装 package 后,都会安装在不同目录,相互之间不受影响,像是被隔离了一样。当用户使用 pip3 show <pkg> 查看已安装的 package 时,也只能看到自己安装的 package。有一个例外是,大家都看到 root 用户安装的(系统)package。当用户自己安装了与系统相同的 package,则优先使用自己安装的 package。
使用 setup.py 安装
[sudo] ./setup.py install [--user]
要从源码安装 Python package 可以使用该方法。此时 package 默认被安装在 /usr/local/lib/python?.?/dist-packages/ 下。当指定 --user 时,package 将被安装在 ${HOME}/.local/lib/python?.?/site-packages/ 下。这些路径与使用 pip3 安装 package 的情况相同。
因此虽然 setup.py 与 pip3 安装 package 的方法不同,但是由于安装路径相同,pip3 可以管理到使用 setup.py 安装的 package。比如 pip3 show 就可以发现 ./setup.py install --user 安装的 package。
另外 pip3 也有 --user 参数(对立的参数为 --system),且在 Debian 中默认被启用:
"On Debian systems, this is the default when running outside of a virtual environment and not as root." from
pip3 install --help
但 ./setup.py 没有默认启用 --user。