Python pip卸载失败,返回“0”;由操作系统所有";-即使在sudo统治下
我正在为一个使用Python的客户机开发一个DevOps项目。虽然我从未专业地使用过它,但我知道一些事情,比如使用virtualenv和pip——尽管不是很详细 当我看着准备运行一个功能测试套件的暂存箱时,我看到了混乱。数以吨计的软件包在全球范围内安装,而那些安装在virtualenv中的软件包与项目的requirements.txt不匹配。好吧,我想,有很多清理工作。从全局包开始 然而,我立刻遇到了一个问题:Python pip卸载失败,返回“0”;由操作系统所有";-即使在sudo统治下,python,python-2.7,pip,virtualenv,Python,Python 2.7,Pip,Virtualenv,我正在为一个使用Python的客户机开发一个DevOps项目。虽然我从未专业地使用过它,但我知道一些事情,比如使用virtualenv和pip——尽管不是很详细 当我看着准备运行一个功能测试套件的暂存箱时,我看到了混乱。数以吨计的软件包在全球范围内安装,而那些安装在virtualenv中的软件包与项目的requirements.txt不匹配。好吧,我想,有很多清理工作。从全局包开始 然而,我立刻遇到了一个问题: ➜ ~ pip uninstall PyYAML Not uninstalling
➜ ~ pip uninstall PyYAML
Not uninstalling PyYAML at /usr/lib/python2.7/dist-packages, owned by OS
好吧,一定有人做过“sudo pip安装PyYAML”。我想我知道如何修复它:
➜ ~ sudo pip uninstall PyYAML
Not uninstalling PyYAML at /usr/lib/python2.7/dist-packages, owned by OS
呃,显然我没有。
一项搜索揭示了一些类似的冲突,这些冲突是由用户绕过pip安装软件包引起的,但我不相信——如果是这样的话,为什么pip会知道呢?除非“其他”方法将它们放在pip将使用的相同位置-但如果是这种情况,为什么它无法在sudo下卸载?关键不是因为您没有足够的权限,pip无法安装该软件包,而是因为它不是通过
pip
安装的软件包,所以它不想卸载它
dist-packages
是操作系统软件包管理器安装的软件包所在的位置;由于它们是由另一个软件包管理器处理的(例如Ubuntu/Debian上的apt
、Arch上的pacman
、CentOS上的rpm
/yum
)pip
不会碰它们(但仍需了解它们,因为它们是已安装的软件包,因此可用于满足pip
-已安装软件包的依赖关系)
除非您使用正确的软件包管理器,否则您可能还应该避免触摸它们,即使如此,它们也可能是自动安装的,以满足某些程序的依赖性,因此您可能无法在不破坏程序的情况下删除它们。这通常可以很容易地进行检查,尽管确切的方法取决于精确的Linux发行版您正在使用。Pip拒绝卸载这些软件包,因为Debian开发人员对其进行了修补。这允许您同时使用
Pip
和apt
。“原始”Pip程序没有此类功能
更新:我的答案仅与旧版本的Pip相关。对于最新版本,Pip配置为仅修改仅位于其“主目录”中的文件-对于Debian,这是/usr/local/lib/python3.
。对于最新的工具,当您尝试删除由apt安装的软件包时,会出现以下错误:
对于pip 9.0.1-2.3~ubuntu1
(从Ubuntu存储库安装):
对于pip 10.0.1
(原装,安装于):
你尝试过以root用户身份卸载它吗?有些时候sudo还不够,我不得不sudo su
itHuh?从来没有听说过这样的事情,尽管sudo相当于“sudo su”方法。不,不起作用,同样的消息。如果你使用virtualenv,为什么还要删除全局包?你遇到过任何问题吗在你的项目中有这些软件包吗?不是真的(或者还没有?)@AndriyMaletsky-我想我不应该太担心。但是作为这个堆栈的新成员,我只是有点偏执=)换句话说,不,不要这样做。谢谢你,先生,你的解释是有道理的。然而,这很奇怪(我在问题中也提到过):如果不是文件权限,是什么阻止pip删除它们?它是否保存了一些它可以触摸的东西的日志,以区别于它不能触摸的东西?我可以在常规pip中找到的两种“不卸载”消息来自;它们都没有说“由OS所有”,而且“由OS所有”在pip存储库中的任何位置都没有出现。我不确定在哪里可以找到Debian版本。我相信这个版本可以在这里找到:我相信它与这个补丁有关:
Not uninstalling pyyaml at /usr/lib/python3/dist-packages, outside environment /usr
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.