如何检测和删除通过 pip 安装的 Python 包?

如何检测和删除通过 pip 安装的 Python 包?

pip我无意中使用而不是将 Python 包安装到我的系统中apt-get。我通过两种方式做到了这一点:

  • 使用旧版本的虚拟环境,我忘记--no-site-packages在创建虚拟环境时附加 - 之后当我调用时pip install,Python 包安装到系统中,而不是虚拟环境中
  • 在正确设置的虚拟环境中,我输入的sudo pip install somepackage是安装到系统而不是虚拟环境中的 sudo

我偶然注意到了这一点,因为我pip freeze在虚拟环境之外输入了内容,并发现列出了一些不应该存在的 Python 包。所以现在我的问题是:

  • 如何识别系统中错误安装的所有 Python 包(即出现在列表中pip freeze但未安装的Python 包apt-get)?
  • 我该如何删除它们?

答案1

Ubuntu Oneiric(我希望更新的版本也一样)将 pip 包安装到/usr/local/lib/python2.7/dist-packages,并将apt包安装到/usr/lib/python2.7/dist-packages。因此,只需检查前一个目录以及sudo pip uninstall您在那里找到的每个包。

答案2

Pip 目前会忽略尝试卸载操作系统所拥有内容的卸载命令。它不会像缺少软件包那样出错。因此,现在您可以按照以下步骤进行卸载:

pip freeze > dump.txt

编辑转储文件以删除所有-e“可编辑安装”行,==符号后面的所有内容(%s;==.*;;g在 vim 中),将新行替换为空格(%s;\n; ;g在 vim 中)。然后,您可以使用以下命令卸载所有未拥有的软件包

cat dump.txt | xargs sudo pip uninstall -y

我必须执行两次这个过程,因为也安装了一些包~/.local/lib


一行代码即可完成此操作:

pip freeze | grep -vP '^(?:#|-e\s)' | sed 's;==.*;;g' | xargs -r sudo pip uninstall -y

答案3

据我所知,sudo pip install它将安装在 上/usr/local/lib/pythonVERSION/dist-packages。您需要运行sudo pip uninstall才能在系统范围内卸载软件包。它似乎pip freeze会查找软件包元数据并列出已安装的任何内容,即来自 pip 以及虚拟环境之外的 apt-get 的内容。-l虚拟环境中有一个选项可以列出仅适用于该虚拟环境的软件包,但它似乎也是虚拟环境中的默认情况。我想您也可以删除相关的软件包,/usr/local/lib/pythonVERSION/dist-packages但我想这不是很方便的方法。

答案4

我需要安全地清理 Python 软件包中的磁盘空间。虽然这是对软件包的彻底清理,但我还需要移动 Python 版本,这样我就不需要旧软件包了。我使用以下命令获取所有软件包名称,跳过前两行并获取第一列,然后在无需用户交互的情况下卸载:

pip list | awk 'NR>2 {print $1}' | xargs -I {} pip uninstall -y {}

相关内容