【问题标题】:What is the easiest way to remove all packages installed by pip?删除 pip 安装的所有软件包的最简单方法是什么?
【发布时间】:2012-06-30 04:13:00
【问题描述】:

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

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

【问题讨论】:

  • @patelshahrukh 正在卸载 python 删除 pip 包。请避免这样做,因为它很可能WON'T WORK你认为它会的方式,,这取决于你如何安装python再次,可能会使您的机器处于需要修复更多工作的不稳定状态。
  • 这可能对在开发模式或可编辑模式下安装的软件包有所帮助:stackoverflow.com/questions/17346619/…

标签: python pip virtualenv python-packaging


【解决方案1】:

我发现这个 sn-p 作为替代解决方案。与重新制作 virtualenv 相比,删除库更优雅:

pip freeze | xargs pip uninstall -y

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

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

【讨论】:

  • 我发现这是一个很好的解决方案,纯粹是因为它不会完全删除虚拟环境 - 我可能已经对例如postactivate 将保留。
  • 运行后我意识到它删除了setuptools 包。我按照这里的说明解决了这个问题:stackoverflow.com/questions/7446187/…
  • 您也可以使用pip freeze --exclude-editable | xargs pip uninstall -y 忽略 VCS 包,而无需使用 grep 模式
  • ERROR: Invalid requirement: '@' 我已经从我的 gitlab 安装了软件包。
  • pip freeze 列出所有包,包括安装在操作系统中的包。如果没有 root 权限,用户将无法(并且可能不希望)删除它们。 pip freeze --user 为我工作。
【解决方案2】:

这适用于所有 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 建议的那样)。

pip uninstall -y -r <(pip freeze)

【讨论】:

  • 可能值得一提的是,您正在强制覆盖他们的 requirements.txt 文件,以防他们不知道。 :)
  • 另外,如果要删除所有包,附加“-y”即可。示例:pip uninstall -r requirements.txt -y
  • 您可以使用pip uninstall -y -r &lt;(pip freeze) 一次性完成所有操作。
  • @joeb 是的,我们也可以这样做。
  • 这是 IMO 的最佳答案。
【解决方案3】:

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

virtualenv --clear MYENV

但是为什么不直接删除并重新创建 virtualenv 呢?

不变性规则。此外,很难记住其他解决方案使用的所有管道和 grep。

【讨论】:

  • 这实际上与运行wipeenv 相同吗? virtualenvwrapper.readthedocs.org/en/latest/…
  • 实际上 - 似乎(从我刚刚遇到的情况来看)而 wipeenv 在环境中会引发错误并且如果在 pip install -e 开发构建的上下文中使用不会删除任何内容,尝试使用 virtualenv --clear MYENV 不会引发错误,并且不会删除您之前在环境中安装的任何包。至少在 OSX 上是这样。请参阅bitbucket.org/dhellmann/virtualenvwrapper/issues/211/… 了解更多信息。
  • wipeenv 是 virtualenvwrapper 提供的别名,所以不是每个人都有。
  • 嗯,这是一种肮脏的把戏,但就像魔术一样。我宁愿每个人都使用 pip uninstall -r requirements.txt -y。这是一个很好的清理。
【解决方案4】:

我想将此答案从评论部分中提升出来,因为它是该主题中最优雅的解决方案之一。这个答案的全部功劳归于@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

【讨论】:

  • 应该很容易成为#1
  • 我喜欢它,但它在 null 情况下不起作用(如果没有安装任何软件包,pip freeze 不会产生任何输出,然后很遗憾 pip uninstall 会抱怨)。
  • 嗯,不错。也许它可以被包装成一个检查 pip freeze 输出是否为非空的 bash 函数。我没有看到一个很好的方法来实现这一点,同时保持命令是一个很好的简短单行。
  • make 默认使用 sh,但替换语法 &lt;(...) 是一种 bashism。因此,您可以使用 bash -c "...",也可以使用 pip freeze | pip uninstall -r /dev/stdin
  • 不适用于 Azure Notebooks: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.
【解决方案5】:

使用pip listpip freeze 的其他答案必须包括--local 否则它还会卸载在公共命名空间中找到的包。

这是我经常使用的sn-p

 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.。然后我无法卸载更多模块。
【解决方案6】:

我通过以下方式管理它:

  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)。

【讨论】:

    【解决方案7】:

    方法一(使用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
    

    【讨论】:

    • sudo 不是必需的,如果不仔细考虑使用它很可能很危险,因为它会影响全局机器设置。例如看这个答案:stackoverflow.com/questions/15028648/…
    • 方法 2 (pip list) 效果很好,除非你让 pip 不小心自行卸载 -_-
    【解决方案8】:

    从虚拟环境中删除所有包的最佳方法

    窗口:

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

    Linux:

    sudo pip3 freeze > unins ; pip3 uninstall -y -r unins ; rm unins
    

    如果不起作用,请将上述命令中的; 更改为&amp;&amp;

    【讨论】:

      【解决方案9】:

      在 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 &gt; unins

      然后,它依次编写的该文件用于卸载上述软件包,并通过pip uninstall -y -r unins 获得默示同意/事先批准

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

      【讨论】:

        【解决方案10】:

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

        pip3 freeze --user | xargs pip3 uninstall -y
        

        【讨论】:

        • 我相信这个答案并没有添加太多新信息,我宁愿建议对另一个已经存在的类似答案进行改进,例如这个:stackoverflow.com/a/45475070/11138259
        • 如果您使用的是 virtualenv 并获得 ERROR: You must give at least one requirement to uninstall,请删除 --user 部分
        • pip3 freeze | xargs pip3 uninstall -y ==> ` PermissionError: [Errno 13] Permission denied: '/usr/local/bin/ap' -> '/tmp/pip-uninstall-q9gzbj0d/ap'`
        • @SL5net。您可能需要以超级用户身份运行它。类似 sudo sh -c 'pip3 freeze | xargs pip3 uninstall -y' (添加的 sh -c 和引号是因为 pipe 不能很好地与 sudo 配合使用)或者你可以以 root 身份执行命令,但我不建议这样做,因为它不是一个好习惯。在 root 中进行炮击很容易意外地破坏您的系统,相信我,在这里讨论的痛苦经历。
        【解决方案11】:

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

        pip freeze > requirements.txt
        

        然后全部删除

        pip uninstall -y -r requirements.txt 
        

        【讨论】:

        • 这个答案很容易理解,对我有用
        【解决方案12】:

        最快的方法是彻底改造 virtualenv。我假设您有一个与生产相匹配的 requirements.txt 文件,如果没有:

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

        【讨论】:

        • 这是否甚至可以处理存在可编辑安装(基本上是 setuptools 开发模式安装)创建本地 .egg-info 文件然后干扰安装/卸载过程的其余部分的情况?由于它是一组文件,它似乎不知道如何处理它们的存在,而不是卸载任何东西,它使 MYENV 下的本地目录结构完成:` > MYENV/bin/python3.4 中的新 python 可执行文件 > 还有在 MYENV/bin/python 中创建可执行文件 > 安装 setuptools、pip、wheel...完成。` 但是 MYENV 并没有重置环境!
        【解决方案13】:

        使用virtualenvwrapper函数:

        wipeenv
        

        wipeenv documentation

        【讨论】:

        • 如果你使用 virtualenvwrapper,输入wipeenv
        • @raratiru,太好了,现在我的同事可能想知道为什么我把咖啡吐在键盘上
        • @BrianJoseph 该死!我从椅子上摔下来了……谢谢!
        【解决方案14】:

        对于 Windows 用户,这是我在 Windows PowerShell

        上使用的
         pip uninstall -y (pip freeze)
        

        【讨论】:

          【解决方案15】:

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

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

          -r, --需求文件

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

          来自pip documentation 8.1 版

          【讨论】:

            【解决方案16】:

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

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

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

            来自man xargs

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

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

            【讨论】:

              【解决方案17】:
              pip3 freeze --local | xargs pip3 uninstall -y
              

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

              【讨论】:

                【解决方案18】:

                这是我卸载所有 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))
                

                【讨论】:

                  【解决方案19】:

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

                  pip freeze 
                  pip uninstall -r requirement
                  

                  通过管道:

                  pipenv run pip freeze 
                  pipenv run pip uninstall -r requirement
                  

                  但不会更新 piplock 或 pipfile,所以请注意

                  【讨论】:

                    【解决方案20】:

                    这适用于我的 Windows 系统

                    pip freeze > packages.txt && pip uninstall -y -r packages.txt && del packages.txt
                    

                    第一部分 pip freeze &gt; packages.txt 创建一个文本文件,其中包含使用 pip 安装的软件包列表以及版本号

                    第二部分pip uninstall -y -r packages.txt 删除所有已安装的包而不要求确认提示。

                    第三部分del packages.txt删除了刚刚创建的packages.txt。

                    【讨论】:

                      【解决方案21】:

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

                      【讨论】:

                        【解决方案22】:

                        这是对我有用的命令:

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

                        【讨论】:

                          【解决方案23】:

                          在 Windows 上,如果您的路径配置正确,您可以使用:

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

                          【讨论】:

                            【解决方案24】:

                            如果你正在运行virtualenv

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

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

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

                            如果你不知道你的虚拟环境在哪里,你可以在一个激活的虚拟环境中运行which python来获取路径

                            【讨论】:

                              【解决方案25】:

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

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

                              【讨论】:

                                【解决方案26】:

                                如果你使用pew,你可以使用wipeenv命令:

                                pew wipeenv [env]

                                【讨论】:

                                  【解决方案27】:

                                  我只是想删除项目安装的包,而不是我安装的其他包(我用于本地开发但不包括在应用程序要求中的 neovimmypypudb )。所以我做了:

                                  cat requirements.txt| sed 's/=.*//g' | xargs pip uninstall -y

                                  这对我很有效。

                                  【讨论】:

                                    【解决方案28】:

                                    选择要从此文件夹中删除的库:

                                    C:\Users\User\AppData\Local\Programs\Python\Python310\Lib\site-packages

                                    【讨论】:

                                    • 虽然这确实删除了所有包(以及更多包),但它并没有像问题那样使用 pip 这样做。
                                    【解决方案29】:

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

                                    $ brew reinstall python
                                    

                                    或者,如果您使用的是pip3

                                    $ brew reinstall python3
                                    

                                    【讨论】:

                                    • 这个答案对环境的假设太多,如果你使用 pyenv 并不能直接解决问题。
                                    • @Mark 好吧,如果您使用的是 pyenv,那么您需要做一些不同的事情。在您不是的常见情况下,我相信这是最简单且最不麻烦的解决方案。请注意,此条件在答案开头明确说明。
                                    • OP 询问了 virtualenvs。他没有具体提到使用 Mac 或 brew 安装 Python。因此,您不能假设使用了操作系统或 brew - 这个答案不会解决所有条件。如果您专注于使用诸如 pip 之类的工具来解决环境问题 - 您将解决您所处环境的上下文。希望这是有道理的。
                                    • @Mark 我理解你的立场。我们可以同意不同意。我只是想帮助那些点击标记为“删除 pip 安装的所有软件包的最简单方法是什么?”的链接的人。当他们真的想通过 pip 删除所有 全局 安装的包时。
                                    • 同意@RadonRosborough,链接标题代表了我为什么登陆这里,即使OP实际上并没有问同样的问题。
                                    【解决方案30】:

                                    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=...。删除所有当前为空的目录也会对你不利!
                                    猜你喜欢
                                    • 2019-11-14
                                    • 1970-01-01
                                    • 2018-10-10
                                    • 2011-11-12
                                    • 2022-10-06
                                    • 1970-01-01
                                    • 2016-03-02
                                    相关资源
                                    最近更新 更多