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

8 浏览
0 Comments

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

我正在处理一个遗留的Dockerfile。以下是我正在处理的一个非常简化的版本:

FROM ubuntu:14.04
RUN apt-get -y update && apt-get -y install \
    python-pip \
    python-numpy # ...和许多其他软件包
RUN pip install -U pip
RUN pip install -r /tmp/requirements1.txt # 包括例如numpy==1.13.0
RUN pip install -r /tmp/requirements2.txt
RUN pip install -r /tmp/requirements3.txt

首先,使用apt安装了几个软件包,然后使用pip安装了几个软件包。pip版本10已发布,并且发布内容之一是这个新的限制:

不再支持卸载使用distutils安装的项目。distutils安装的项目不包括指示哪些文件属于该安装的元数据,因此无法真正卸载它们,而只是删除元数据,表示它们已被安装,同时保留所有实际文件。

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

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.

现在我知道此时有几个解决方案。

我可以不通过apt安装python-numpy。然而,这会引起问题,因为python-numpy会安装几个不同的包作为依赖项,我不知道系统的其他部分是否依赖这些包。事实上,通过Dockerfile安装了几个apt软件包,我删除的每一个似乎都会出现另一个Cannot uninstall X错误,并且连同其它软件包一起删除,这可能是我们的应用程序依赖的或可能不依赖的。

我还可以在尝试通过apt已经安装的软件包时使用--ignore-installed选项,但同样,我遇到了每个--ignore-installed参数都会揭示出需要被忽略的另一个问题。

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

我一直在困惑中循环,试图找到一个最小更改这个遗留Dockerfile的好解决方案,并允许我们使用该文件部署的应用程序继续正常工作。有关如何安全地解决pip 10无法安装较新版本distutils软件包的问题的任何建议吗?谢谢!

更新:

我没有意识到--ignore-installed可以在不带软件包参数的情况下使用,以忽略所有已安装的软件包。我正在考虑是否这对我来说是一个不错的选择,并在这里提出了相关问题。

0