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 {}