当前位置: 首页 > 面试题库 >

pip 10和apt:如何避免distutils软件包出现“无法卸载X”错误

李成礼
2023-03-14
问题内容

我正在处理旧版Dockerfile。这是我正在处理的 非常简化的 版本:

FROM ubuntu:14.04

RUN apt-get -y update && apt-get -y install \
    python-pip \
    python-numpy # ...and many other packages

RUN pip install -U pip

RUN pip install -r /tmp/requirements1.txt # includes e.g., numpy==1.13.0
RUN pip install -r /tmp/requirements2.txt
RUN pip install -r /tmp/requirements3.txt

首先,使用安装多个软件包apt,然后使用安装多个软件包pippip版本10已发布,部分发布是此新限制:

删除了对卸载使用distutils安装的项目的支持。distutils安装的项目不包含指示该安装属于哪些文件的元数据,因此无法实际卸载它们,而仅删除表示已安装文件的元数据而将所有实际文件都留在后面是不可能的。

这在我的设置中导致以下问题。例如,首先apt安装python- numpy。稍后pip尝试从安装numpy例如的较新版本/tmp/requirements1.txt,并尝试卸载较旧的版本,但是由于新的限制,它无法删除此版本:

Installing collected packages: numpy
  Found existing installation: numpy 1.8.2
Cannot uninstall 'numpy'. 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.

现在我知道目前有几种解决方案。

我无法python-numpy通过安装apt。但是,这会引起问题,因为需要python- numpy安装几个不同的软件包,并且我不知道系统的另一部分是否依赖于这些软件包。实际上,apt通过Dockerfile安装了几个软件包,而我删除的每个软件包似乎都揭示了另一个Cannot uninstall X错误,并删除了我们的应用程序可能依赖或可能不依赖的许多其他软件包。

--ignore-installed当我尝试pip安装已通过安装的东西时,我也可以使用该选项apt,但是同样,我对每个--ignore- installed参数都存在相同的问题,它揭示了另一个需要忽略的东西。

我可以pip使用没有此限制的较旧版本,但我不想pip永远使用过时的版本。

我一直在努力寻找一种好的html" target="_blank">解决方案,该解决方案只需对该旧Dockerfile进行最小的更改,并允许我们使用该文件部署的应用程序继续按原样运行。关于如何安全解决pip10个无法安装较新版本distutils软件包的问题的任何建议?谢谢!

我不知道--ignore- installed没有包就可以将其用作忽略所有已安装包的参数。我正在考虑这是否对我来说是一个不错的选择,并在这里对此进行了询问。


问题答案:

这是我最终使用的解决方案,并且使用此修复程序后,我们的应用已在生产中运行了近一个月,没有任何问题:

我要做的就是添加

--ignore-installed

pip install我的dockerfile中出现错误的行。使用我原始问题中相同的dockerfile示例,固定的dockerfile如下所示:

FROM ubuntu:14.04

RUN apt-get -y update && apt-get -y install \
    python-pip \
    python-numpy # ...and many other packages

RUN pip install -U pip

RUN pip install -r /tmp/requirements1.txt --ignore-installed # don't try to uninstall existing packages, e.g., numpy
RUN pip install -r /tmp/requirements2.txt
RUN pip install -r /tmp/requirements3.txt

--ignore-installed我认为我找不到的文档不清楚(pip install --help只是说“忽略已安装的软件包(改为重新安装)。”),我在这里询问了此标志的潜在危险,但尚未获得令人满意的答案。但是,如果有任何负面影响,我们的生产环境尚未看到它们的影响,我认为风险很小/没有(至少这是我们的经验)。我可以确认在我们的情况下,使用此标志时,不会卸载现有安装,但始终使用较新的安装。

更新:

我想通过@ivan_pozdeev 突出此答案。他提供了该答案未包括的一些信息,并且还概述了我的解决方案的一些潜在副作用。



 类似资料:
  • 问题内容: 您可以简单地从python安装中删除目录,还是必须删除任何残留文件? 问题答案: 它取决于您传递给的选项以及系统/软件包中distutils配置文件的内容。我不相信会以这些方式在指定目录之外修改任何文件。 值得注意的是,distutils目前没有卸载命令。 还值得注意的是,删除程序包/鸡蛋可能会导致依赖关系问题,例如尝试减轻此类问题的实用程序。

  • 我希望卸载Python2.7和所有连接到它的包。我最初从官方网站安装Python,并使用pip install命令安装所有软件包。从控制面板卸载Python是否也会自动卸载所有软件包? 我想卸载Python的原因是,我想使用Anaconda,以便能够更轻松地管理包,并且能够安装Python2和Python3,以便在它们之间来回切换。

  • 如何在Mac OS X中完全卸载(删除属于某个包的文件)?这可以使用终端中的命令来完成吗? 我已经安装了一个。在Mac上安装pkg软件包,我想知道如何在不使用第三方应用程序(如UninstallPKG)的情况下卸载整个软件包? 我想知道卸载. dmg文件是否也需要第三方应用程序,或者是否可以在终端中输入命令卸载它们?

  • 问题内容: 在我的GOPATH中,我有类似以下内容: 在我,在和我有。 当我尝试出现以下错误时: 这是否意味着任何属于的文件都应该放在其自己的文件夹中?如果是这样,原因是什么? 问题答案: 是的,每个程序包必须在其自己的目录中定义。 源结构在如何编写Go代码中定义。 包是可以在多个程序中使用,可以发布,导入,从URL获取等的组件。因此,使其具有自己的目录和程序可以具有的目录一样多是有意义的。

  • 问题内容: 当我尝试从虚拟环境中卸载时,我看到它也尝试卸载更多软件包: 我想卸载 只 和没有别的降级。 我知道这些软件包都 依赖 于熊猫甚至 特定版本 的panda,但这完全可能吗? 部分动机 我的理解是,使用来从GitHub安装软件包并不容易。至少它不像使用单线纸那样容易。 由于我想在中使用该版本,因此我的计划是卸载该版本,并使用从正式仓库GitHub上的master安装。 我怎样才能做到这一点

  • 问题内容: 使用setuptools时,无法让安装程序提取任何文件。我读过的所有内容都表明,以下是正确的方法。有人可以请教吗? 数据文件的位置在哪里。 问题答案: 我知道这是一个老问题,但人们发现这里通过谷歌自己的方式: 是低了下来,肮脏的谎言。它仅在构建 二进制 软件包()时使用, 而 在构建源软件包()时不使用。当然,这是荒谬的-人们希望构建源代码分发将导致文件的集合,这些文件可以发送给其他人