pip 卸载失败并显示 "owned by OS" - 即使在 sudo 下

pip uninstall fails with "owned by OS" - even under sudo

我正在为使用 Python 的客户开发 DevOps 项目。虽然我从未专业地使用过它,但我知道一些事情,例如使用 virtualenv 和 pip - 虽然不是很详细。

当我查看我试图为 运行 功能测试套件准备的暂存箱时,我看到了混乱。全球安装了大量的软件包,而安装在 virtualenv 中的软件包与项目的 requirements.txt 不匹配。好吧,我想,有很多清理工作。从全局包开始。

但是,我运行一下子陷入了一个问题:

➜  ~ pip uninstall PyYAML
Not uninstalling PyYAML at /usr/lib/python2.7/dist-packages, owned by OS

好的,肯定有人做过 'sudo pip install PyYAML'。我想我知道如何解决它:

➜  ~ sudo pip uninstall PyYAML
Not uninstalling PyYAML at /usr/lib/python2.7/dist-packages, owned by OS

呃,显然我不知道。 搜索显示用户绕过 pip 安装包引起了一些类似的冲突,但我不相信 - 如果是这样的话,为什么 pip 甚至知道它们?除非 "other" 方法将它们放在 pip 将使用的相同位置 - 但如果是这样,为什么在 sudo 下无法卸载?

重点不是pip安装不了包,因为你没有足够的权限,而是因为它不是通过pip安装的包,所以不想卸载它。

dist-packages 是 OS 包管理器安装的包所在的位置;因为它们由另一个包管理器处理(例如 Ubuntu/Debian 上的 apt,Arch 上的 pacman,CentOS 上的 rpm/yum,. .. ) pip 不会触及它们(但仍然必须了解它们,因为它们是已安装的软件包,因此它们 可以 用于满足 pip-安装包)。

除非你使用正确的包管理器,否则你可能还应该避免接触它们,即使如此,它们可能已经自动安装以满足某些程序的依赖性,因此你可能不会在不破坏它的情况下删除它们。这通常可以很容易地检查,尽管确切的方法取决于您使用的精确 Linux 分布。

Pip 拒绝卸载这些软件包,因为 Debian 开发人员对其进行了修补以使其表现如此。这允许您同时使用 pipapt。 "original" pip 程序没有这样的功能

更新: 我的回答只适用于旧版本的 Pip。对于最新版本,Pip 配置为仅修改仅驻留在其 "home directory" 中的文件 - 即 Debian 的 /usr/local/lib/python3.*。对于最新的工具,当您尝试删除由 apt:

安装的软件包时,您会遇到这些错误

对于 pip 9.0.1-2.3~ubuntu1(从 Ubuntu 存储库安装):

Not uninstalling pyyaml at /usr/lib/python3/dist-packages, outside environment /usr

对于 pip 10.0.1(原始,从 pypi.org 安装):

Cannot uninstall 'PyYAML'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.