pip 10和apt:如何避免对distutils包出现“无法卸载X”的错误
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
可以在不带软件包参数的情况下使用,以忽略所有已安装的软件包。我正在考虑是否这对我来说是一个不错的选择,并在这里提出了相关问题。