删除pip安装的所有软件包的最简单方法是什么?


612

我正在尝试修复我的virtualenv之一-我想将所有已安装的库重置为与生产相匹配的库。

有没有一种快速简便的方法来使用pip?


10
@patelshahrukh卸载python 不会删除pip包。请避免这样做,因为它极有可能无法按照您的想法工作并且(取决于再次安装python的方式)可能会使您的计算机处于不稳定的状态,需要更多的工作来修复
blueberryfields

对于安装在发展模式或可编辑模式包这可能帮助:stackoverflow.com/questions/17346619/...
查理帕克

Answers:


921

我已找到此代码段作为替代解决方案。与重建virtualenv相比,这是对库的更优雅的删除:

pip freeze | xargs pip uninstall -y

如果您通过VCS安装了软件包,则需要排除这些行并手动删除软件包(从下面的注释中升高):

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

4
我发现这是一个很好的解决方案,纯粹是因为它不能完全删除虚拟环境-我可能对例如postactivate将要保留的内容进行了更改。
niceguydave

5
运行此程序后,我意识到它已删除了setuptools程序包。我解决了以下说明这里的问题:stackoverflow.com/questions/7446187/...

1
@ gerty3000是的,这(按问题要求)将删除虚拟环境中安装的所有软件包。在您的环境中,也许最好将setuptools安装在全局位置上?
blueberryfields

7
您也可以pip freeze --exclude-editable | xargs pip uninstall -y不使用grep模式而忽略VCS软件包
Connor Brinton,

2
要卸载可编辑的程序包,请参见stackoverflow.com/questions/17346619
Dan Oak,

317

这将适用于所有Mac,Windows和Linux系统。要在requirements.txt文件中获取所有pip包的列表(注意:如果存在,它将覆盖requirements.txt,否则将创建新的pip包,如果您不想替换旧的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建议)。

pip uninstall -y -r <(pip freeze)

11
可能值得一提的是,如果他们不知道,您将强制覆盖他们的requirements.txt文件。:)
Dave Gregory

4
此外,如果要删除所有软件包,请附加“ -y”。范例:pip uninstall -r requirements.txt -y
David Metcalfe's

58
您可以pip uninstall -y -r <(pip freeze)一次性完成所有操作。
joeb

1
@joeb是的,我们也可以这样做。
Harshad Kavathiya

1
@HarshadKavathiya,您可以使用另一个文件来存储点冻结,例如“ current.txt”,因此
Requirements.txt

117

这适用于最新版本。我认为这是最短,最声明的方式。

virtualenv --clear MYENV

但是通常由于不变性规则,我只是删除并重新创建virtualenv!


7
这实际上与跑步相同wipeenv吗?virtualenvwrapper.readthedocs.org/en/latest/...
泰勒Edmiston的

实际上-似乎(从我刚遇到的情况来看)而wipeenv在环境中,如果在pip install -e开发版本的上下文中使用,则抛出错误并且不会删除任何内容,而尝试使用virtualenv --clear MYENV不会抛出错误并且不会删除任何错误您以前在环境中安装的软件包。至少在OSX上是这种情况。有关更多信息,请参见bitbucket.org/dhellmann/virtualenvwrapper/issues/211/…
mpacer

2
wipeenv是virtualenvwrapper提供的别名,因此并非所有人都拥有。
乔纳森·哈特利

2
好吧,这是一个肮脏的把戏,但就像魔术一样。我希望每个人都使用pip卸载-r requirements.txt -y。它可以很好地清理。
Muema,

84

我想在评论部分中提出这个答案,因为它是线程中最优雅的解决方案之一。此答案的全部功劳归@joeb

pip uninstall -y -r <(pip freeze)

对于清除在virtualenv上下文之外的我的用户包文件夹的用例来说,这对我来说非常有用,上面的许多答案都无法解决。

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

奖励:bash别名

为了方便起见,我将其添加到我的bash个人资料中:

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

然后运行:

pipuninstallall

Pipenv的替代品

如果碰巧正在使用pipenv,则可以运行:

pipenv uninstall --all

8
应该轻松地成为第一名
马克

我喜欢它,但在null情况下不起作用(不幸的是pip freeze,如果未安装任何软件包,则不会输出任何内容,然后会pip uninstall抱怨)。
埃里克·G

嗯好抓。也许可以将其包装到bash函数中,该函数检查pip冻结输出是否为非空。在使命令保持良好的简短效果的同时,我看不到一种实现此目标的好方法。
泰勒·埃德米斯顿

1
make默认情况下使用sh,但是替换语法<(...)是bashism。因此,您可以使用bash -c“ ...”,也可以通过执行pip freeze | pip uninstall -r /dev/stdin
Caesar

不适用于Azure笔记本: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

54

使用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

39

方法1(带有pip freeze

pip freeze | xargs pip uninstall -y

方法2(带有pip list

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

方法3(带有virtualenv

virtualenv --clear MYENV

2
sudo是不必要的,如果不仔细考虑,使用它很危险,因为它会影响全局计算机设置。看到这个答案,例如:stackoverflow.com/questions/15028648/...
blueberryfields

6
方法2(pip list)效果很好,直到您pip意外地将自身卸载-_-
贾斯汀

19

最快的方法是完全重新制作virtualenv。我假设您有一个与生产匹配的requirements.txt文件,如果不匹配:

# On production:
pip freeze > reqs.txt

# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt

2
这是否还解决了存在可编辑安装(基本上是setuptools开发模式安装)的情况,该安装创建了本地.egg-info文件,然后干扰了其余的安装/卸载过程?由于它是一组文件,因此似乎不知道如何处理它们的存在,并且除了卸载任何文件外,它还使MYENV下的本地目录结构完整:`> MYENV / bin / python3.4中的新python可执行文件>另外在MYENV / bin / python中创建可执行文件>安装setuptools,pip,wheel ...完成。但是MYENV尚未重置环境!
mpacer

19

我通过执行以下操作来管理它:

使用当前安装的软件包列表创建名为reqs.txt的需求文件

pip freeze > reqs.txt

然后从reqs.txt卸载所有软件包

pip uninstall \
   -y # remove the package with prompting for confirmation
   -r reqs.txt

我喜欢这种方法,因为您总是有一个pip要求文件,以防您出错。这也是可重复的。


简单而优雅,像魅力一样工作
Satyaaditya

16

在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

该文件最终在完成后被删除。



14

首先,将所有软件包添加到 requirements.txt

pip freeze > requirements.txt

然后删除所有

pip uninstall -y -r requirements.txt 

8

我知道这是一个古老的问题,但是我确实偶然发现了,因此为了将来参考,您现在可以这样做:

pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...

-r,-要求文件

卸载给定需求文件中列出的所有软件包。此选项可以多次使用。

pip文档版本8.1


8

对于Windows用户,这是我在Windows PowerShell上使用的

 pip uninstall -y (pip freeze)

6

(将此添加为答案,因为我没有足够的声誉来评论@blueberryfields的答案)

@blueberryfields的答案很好用,但如果没有要卸载的软件包则失败(如果此“全部卸载”是脚本或makefile的一部分,则可能是一个问题)。这可以通过xargs -r使用GNU版本的来解决xargs

pip freeze --exclude-editable | xargs -r pip uninstall -y

来自man xargs

-r,--no-run-if-empty

如果标准输入不包含任何非空格,请不要运行该命令。通常,即使没有输入,命令也会运行一次。此选项是GNU扩展。


6
pip3 freeze --local | xargs pip3 uninstall -y

这种情况可能是必须多次运行此命令才能得到一个空的pip3 freeze --local


3

这是我卸载所有python软件包的最简单方法。

from pip import get_installed_distributions
from os import system
for i in get_installed_distributions():
    system("pip3 uninstall {} -y -q".format(i.key))

2

仅使用即可提供跨平台支持pip

#!/usr/bin/env python

from sys import stderr
from pip.commands.uninstall import UninstallCommand
from pip import get_installed_distributions

pip_uninstall = UninstallCommand()
options, args = pip_uninstall.parse_args([
    package.project_name
    for package in
    get_installed_distributions()
    if not package.location.endswith('dist-packages')
])

options.yes = True  # Don't confirm before uninstall
# set `options.require_venv` to True for virtualenv restriction

try:
    print pip_uninstall.run(options, args)
except OSError as e:
    if e.errno != 13:
        raise e
    print >> stderr, "You lack permissions to uninstall this package.
                      Perhaps run with sudo? Exiting."
    exit(13)
# Plenty of other exceptions can be thrown, e.g.: `InstallationError`
# handle them if you want to.

2

这是对我有用的命令:

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

2

跨平台和在pipenv中工作的简单而健壮的方法是:

pip freeze 
pip uninstall -r requirement

通过pipenv:

pipenv run pip freeze 
pipenv run pip uninstall -r requirement

但不会更新piplock或pipfile,因此请注意


1

如果您正在跑步virtualenv

virtualenv --clear </path/to/your/virtualenv>

例如,如果您的virtualenv是/Users/you/.virtualenvs/projectx,那么您将运行:

virtualenv --clear /Users/you/.virtualenvs/projectx

如果您不知道虚拟环境的位置,则可以which python在已激活的虚拟环境中运行以获取路径


1

就我而言,我意外地使用pip在macOS上安装的Homebrew 在全球范围内安装了许多软件包。恢复默认软件包的最简单方法是:

$ brew reinstall python

或者,如果您使用的是pip3

$ brew reinstall python3

这个答案对环境的假设太多了,例如,如果您使用的是pyenv,并不能直接解决问题。
Mark

@Mark好吧,如果您使用的是pyenv,则需要做一些不同的事情。在您通常不是的情况下,我相信这是最简单,最不容易破解的解决方案。请注意,在答案的开头明确指出了这种情况。
Radon Rosborough

OP询问了有关virtualenvs的问题。他没有特别提到使用Mac或brew安装Python。因此,您不能假定使用了OS或Brew-并且此答案不能解决所有问题。如果您专注于使用pip之类的工具来解决环境问题,那么您将解决所处环境的问题。希望有道理。
标记

1
@马克我明白你的立场。我们可以同意不同意。我只想帮助Google的工作人员,他们单击了标记为“删除pip安装的所有软件包的最简单方法是什么?”的链接。当他们真正想要删除pip 全局安装的所有软件包时。
Radon Rosborough

同意@RadonRosborough,即使OP并没有问相同的问题,链接标题也代表了我为什么登陆这里。
肯·塞贝斯塔

1

在Windows的Command Shell中,该命令pip freeze | xargs pip uninstall -y将不起作用。因此,对于那些使用Windows的人,我已经找到了一种替代方法。

  1. 将已安装的pip软件包的所有名称从pip freeze命令复制到.txt文件。
  2. 然后,转到您的.txt文件的位置并运行以下命令pip uninstall -r *textfile.txt*


1

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

pip3冻结--user | xargs pip3卸载-y


我相信此答案不会增加太多新信息,我宁愿建议对另一个已经存在的类似答案进行改进,例如:stackoverflow.com/a/45475070/11138259
sinoroc

-1

Pip无法知道它安装了哪些软件包以及系统的软件包管理器安装了哪些软件包。为此,您需要执行以下操作

对于基于rpm的发行版(将python2.7替换为安装了pip的python版本):

find /usr/lib/python2.7/ |while read f; do
  if ! rpm -qf "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

对于基于Deb的发行版:

find /usr/lib/python2.7/ |while read f; do
  if ! dpkg-query -S "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

然后清理剩下的空目录:

find /usr/lib/python2.7 -type d -empty |xargs rm -fr

我发现最重要的答案很容易引起误解,因为它会删除您发行版中的所有(大多数?)python软件包,并可能使您的系统崩溃。


尽一切应有的尊重,这似乎是可比的。为什么不dpkg-query -S '/usr/lib/python2.7/*'提取dpkg-query -L每个名称来转储关联文件呢?它已经准备好了清单。我的主要反对意见是,您不是将安装包定位为通过pip安装在任何地方,而是将安装包定位为不是您期望的管理者以外的其他任何位置,并且安装位置通常不应碰到pip。pip list -l列出了它在本地安装的软件包,有些甚至会列出pip install --target=...。删除所有当前空的目录也将对您造成伤害!
约翰·P
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.