如何删除通过pip安装的所有软件包?

1223

如何从当前已激活的虚拟环境中卸载由pip安装的所有软件包?


60
卸载Python并不会删除pip软件包。请避免这样做,因为它很可能无法按照您预期的方式工作,并且取决于您如何重新安装Python,可能会导致您的机器处于不稳定状态,需要更多的工作来修复。 - blueberryfields
2
这可能有助于以开发模式或可编辑模式安装的软件包:https://dev59.com/zGQm5IYBdhLWcg3wyhVE - Charlie Parker
35个回答

1721

我找到了这段代码作为一种替代解决方案。与重新创建虚拟环境相比,它更加优雅地删除库:

pip freeze | xargs pip uninstall -y

如果您安装了通过版本控制系统(VCS)的软件包,则需要排除这些行并手动删除这些软件包(根据下面的评论提升):

pip freeze | grep -v "^-e" | xargs pip uninstall -y

如果你直接从github/gitlab安装了软件包,那么它们会带有@符号。

例如:

django @ git+https://github.com/django.git@<sha>

你可以添加cut -d "@" -f1来获取只需要卸载该软件包的名称。

pip freeze | cut -d "@" -f1 | xargs pip uninstall -y

15
我认为这是一个好的解决方案,纯粹是因为它并没有完全删除虚拟环境 - 我可能已经对postactivate等进行了更改,这些更改将保留下来。 - niceguydave
29
您也可以使用 pip freeze --exclude-editable | xargs pip uninstall -y 命令来忽略版本控制系统中的软件包,而无需使用 grep 模式。该命令不会改变原意,只是让语言更加通俗易懂。 - Connor Brinton
50
错误:无效要求:“@” 我安装了从我的 GitLab 安装的软件包。 - mRyan
31
pip freeze列出所有包,包括在操作系统中安装的包。用户无法(或可能不想)在没有根权限的情况下删除它们。 pip freeze --user 对我有效。 - user1079505
15
@mRyan 对我来说,pip list --format=freeze |xargs pip uninstall -y 就解决了问题。 - skynet1010
显示剩余21条评论

874

这适用于所有的Mac、Windows和Linux系统。 要获取requirements.txt文件中所有pip包的列表(注意:如果存在,这将覆盖requirements.txt,否则将创建新的文件,如果您不想替换旧的requirements.txt,则在以下所有命令中提供不同的文件名以代替requirements.txt)。

pip freeze > requirements.txt

现在逐个删除

pip uninstall -r requirements.txt

如果我们想要一次性全部删除,则可以使用以下代码:
pip uninstall -r requirements.txt -y

如果你正在处理一个已存在的项目,它有一个 requirements.txt 文件且你的环境已经发生了变化,只需将上面示例中的 requirements.txt 替换为 toberemoved.txt。然后,在完成上述步骤后,你可以使用 requirements.txt 更新你现在干净的环境。

而对于不创建任何文件的单个命令,@joeb提出了以下建议suggested

pip uninstall -y -r <(pip freeze)

27
可能值得一提的是,您正在强制覆盖他们的 requirements.txt 文件,以防他们不知道。 :) - Dave Gregory
7
另外,如果想要移除所有包,可以在命令后面添加"-y"。例如:pip uninstall -r requirements.txt -y - David Metcalfe
158
你可以使用 pip uninstall -y -r <(pip freeze) 一次性完成所有操作。 - joebeeson
1
@joeb 是的,我们也可以那样做。 - Harshad Kavathiya
1
@HarshadKavathiya,你可以使用另一个文件来存储pip freeze的内容,例如“current.txt”,这样就可以保持requirements.txt不变了。祝好! - katsos
显示剩余8条评论

213

我想把这个答案从评论区提升出来,因为它是该讨论串中最优雅的解决方案之一。全文鸣谢@joeb

pip uninstall -y -r <(pip freeze)

对于我而言,在虚拟环境之外清除用户包文件夹的用例中,这对我非常有效,而上面的许多答案都无法处理。

编辑:有人知道如何在Makefile中使此命令工作吗?

奖励: 一个bash别名

我将其添加到我的bash配置文件中以便于使用:

alias pipuninstallall="pip uninstall -y -r <(pip freeze)"

然后运行:

pipuninstallall

Pipenv的替代方案

如果您正在使用pipenv,您可以运行以下命令:

pipenv uninstall --all

诗歌替代方案

如果您正在使用Poetry,请运行:

poetry env remove --python3.9

(请注意,您需要更改那里的版本号以匹配您的Python版本。)


我喜欢它,但是在空值情况下它不起作用(如果没有安装软件包,则pip freeze不会输出任何内容,然后pip uninstall会出错)。 - Eric G
2
默认情况下 make 使用 sh,但是替换语法 <(...) 是一种 bashism。因此您可以使用 bash -c“...”,或者通过执行 pip freeze | pip uninstall -r /dev/stdin 来解决问题。 - Caesar
2
无法在Azure笔记本上使用:错误:无法卸载'bitarray'。它是一个distutils安装的项目,因此我们无法准确确定哪些文件属于它,这将导致部分卸载。 - SeaDude
在你的Makefile文件顶部添加SHELL := /usr/bin/env bash。参见https://www.gnu.org/software/make/manual/html_node/Choosing-the-Shell.html。 - Jens
无法在Windows上运行,“系统找不到指定的文件。” - Muhammad Yasirroni
显示剩余2条评论

155

这适用于最新版本。我认为这是最短、最直接的方法。

virtualenv --clear MYENV

为什么不直接删除并重新创建虚拟环境呢?

因为不变性原则。而且其他解决方案使用管道和grep时很难记住所有内容。


9
这是否与运行wipeenv命令效果相同?http://virtualenvwrapper.readthedocs.org/en/latest/command_ref.html#wipeenv - Taylor D. Edmiston
实际上 - 从我刚遇到的情况来看,当在环境中使用wipeenv会抛出错误,并且如果在 pip install -e开发构建的上下文中使用,则不会删除任何内容。但尝试使用 virtualenv --clear MYENV 不会抛出错误,并且也不会删除之前可能在环境中安装的任何包。至少在OSX上是这种情况。有关更多信息,请参见https://bitbucket.org/dhellmann/virtualenvwrapper/issues/211/wipeenv-does-not-work-when-pip-install-e。 - mpacer
4
wipeenv 是 virtualenvwrapper 提供的别名,因此并非每个人都有它。 - Jonathan Hartley
3
这是有点不太光彩的方法,但是非常有效。我建议每个人都使用pip uninstall -r requirements.txt -y,这样可以很好地清理干净。 - Muema

71

我通过以下方式完成了它:

  1. 创建名为reqs.txt的要求文件,其中包含当前安装的软件包列表
pip freeze > reqs.txt
  1. 然后从 reqs.txt 卸载所有的软件包。
# -y means remove the package without prompting for confirmation
pip uninstall -y -r reqs.txt

我喜欢这种方法,因为你可以随时依靠pip需求文件来纠正错误。而且它是可重复的,并且跨平台(Windows、Linux、MacOS)。


67

其他使用 pip listpip freeze 的答案必须包含 --local,否则它也会卸载在通用命名空间中找到的软件包。

这是我经常使用的代码片段:

 pip freeze --local | xargs pip uninstall -y

参考:pip freeze --help


这个程序一直运行良好,直到遇到一个产生了以下错误的软件包: ERROR: Cannot uninstall 'bitarray'. 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. 之后,我就无法卸载任何其他模块了。 - SeaDude

45

方法1(使用pip freeze

pip freeze | xargs pip uninstall -y

方法二(使用pip list

pip list | awk '{print $1}' | xargs pip uninstall -y

方法三(使用virtualenv

virtualenv --clear MYENV

2
sudo 不是必需的,而且很可能在没有仔细考虑的情况下使用会带来危险,因为它会影响全局机器设置。请参考此答案:https://dev59.com/emUp5IYBdhLWcg3wz58H - blueberryfields
9
方法二(pip list)在你的 pip 不小心被卸载之前是很好用的 -_- - Justin
方法二在我的情况下不起作用,因为列表中有一个需要被忽略的标题。这个可以用:pip list | awk '{print $1}' | grep -vE "^pip$|^Package$|^---" | xargs pip uninstall -y - Menda

39

在Windows上,如果您的path正确配置,则可以使用以下命令:

pip freeze > unins && pip uninstall -y -r unins && del unins

对于类Unix系统来说,情况应该是类似的:

pip freeze > unins && pip uninstall -y -r unins && rm unins

警告:这并非完全稳定,可能会遇到“文件未找到”等问题,但在某些情况下仍可使用。

编辑说明:unins是一个任意的文件,在执行此命令时将数据写入其中:pip freeze > unins

然后,该文件再被用于通过pip uninstall -y -r unins以暗示同意/预先批准的方式卸载上述软件包。

完成后,该文件将被删除。


31

我使用--user选项来卸载安装在用户站点中的所有软件包。

pip3 freeze --user | xargs pip3 uninstall -y

我认为这个答案没有提供太多新信息,我更愿意建议改进另一个已经存在的类似答案,比如这个:https://dev59.com/R2gu5IYBdhLWcg3winrU#45475070 - sinoroc
1
如果您正在使用virtualenv并且出现“ERROR:You must give at least one requirement to uninstall”的错误,请删除--user部分。 - Checo R
pip3 freeze | xargs pip3 uninstall -y ==> PermissionError: [Errno 13] Permission denied: '/usr/local/bin/ap' -> '/tmp/pip-uninstall-q9gzbj0d/ap' - SL5net
1
@SL5net。您可能需要以超级用户身份运行它。类似于sudo sh -c 'pip3 freeze | xargs pip3 uninstall -y'(添加sh -c和引号是因为管道通常不与sudo兼容)。或者,您可以直接以root身份运行命令,但我不建议这样做,因为这不是一个好习惯。在root中操作很容易意外破坏您的系统,相信我,这是苦涩的经验谈。 - Shayne
--user选项的好处在于它只列出用户安装的包,而不是本地安装的所有包。因为--local会列出本地安装的所有包,而不仅仅是用户安装的包。 - somenxavier

23

对于Windows用户来说,这是我在Windows PowerShell上使用的方法。

 pip uninstall -y (pip freeze)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接