Pip: 升级到 pip 10:这是一个安装了 distutils 的项目,因此我们无法准确确定哪些文件属于它,这只会导致部分卸载。

创建于 2018-04-16  ·  41评论  ·  资料来源: pypa/pip

  • 点子版本:10.0.0
  • Python版本:2.7
  • 操作系统:Amazon ECS-Optimized Amazon Linux AMI 2017.09.i

描述:

我正在尝试安装 docker-py,它是我们基础设施设置工作流程的一个常见部分,我们运行了很长一段时间。 对于某些软件包,我收到以下错误:

Cannot uninstall 'PyYAML'. 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.

使用 pip 9.0.2 一切正常。 有什么改变吗? 我能做些什么来解决这个问题? (除了将 pip 的版本固定到 9.0.2 或 9.0.3)

我跑过的:

使用 pip 10 进行第一次安装尝试

# /usr/local/bin/pip2 install docker-py
Collecting docker-py
  Using cached docker_py-1.10.6-py2.py3-none-any.whl
Requirement already satisfied: six>=1.4.0 in /usr/local/lib/python2.7/site-packages (from docker-py) (1.11.0)
Requirement already satisfied: backports.ssl-match-hostname>=3.5; python_version < "3.5" in /usr/local/lib/python2.7/site-packages (from docker-py) (3.5.0.1)
Requirement already satisfied: ipaddress>=1.0.16; python_version < "3.3" in /usr/local/lib/python2.7/site-packages (from docker-py) (1.0.22)
Requirement already satisfied: websocket-client>=0.32.0 in /usr/local/lib/python2.7/site-packages (from docker-py) (0.47.0)
Collecting requests!=2.11.0,>=2.5.2 (from docker-py)
  Using cached requests-2.18.4-py2.py3-none-any.whl
Collecting docker-pycreds>=0.2.1 (from docker-py)
  Using cached docker_pycreds-0.2.2-py2.py3-none-any.whl
Requirement already satisfied: idna<2.7,>=2.5 in /usr/local/lib/python2.7/site-packages (from requests!=2.11.0,>=2.5.2->docker-py) (2.6)
Requirement already satisfied: urllib3<1.23,>=1.21.1 in /usr/local/lib/python2.7/site-packages (from requests!=2.11.0,>=2.5.2->docker-py) (1.22)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python2.7/site-packages (from requests!=2.11.0,>=2.5.2->docker-py) (2018.1.18)
Collecting chardet<3.1.0,>=3.0.2 (from requests!=2.11.0,>=2.5.2->docker-py)
  Using cached chardet-3.0.4-py2.py3-none-any.whl
Installing collected packages: chardet, requests, docker-pycreds, docker-py
  Found existing installation: chardet 2.0.1
Cannot uninstall 'chardet'. 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.

降级到 pip 9.0.3 然后得到这个:

# /usr/local/bin/pip2 install docker-py
Collecting docker-py
  Cache entry deserialization failed, entry ignored
  Cache entry deserialization failed, entry ignored
  Downloading docker_py-1.10.6-py2.py3-none-any.whl (50kB)
    100% |████████████████████████████████| 51kB 4.8MB/s
Requirement already satisfied: six>=1.4.0 in /usr/local/lib/python2.7/site-packages (from docker-py)
Requirement already satisfied: backports.ssl-match-hostname>=3.5; python_version < "3.5" in /usr/local/lib/python2.7/site-packages (from docker-py)
Requirement already satisfied: ipaddress>=1.0.16; python_version < "3.3" in /usr/local/lib/python2.7/site-packages (from docker-py)
Requirement already satisfied: websocket-client>=0.32.0 in /usr/local/lib/python2.7/site-packages (from docker-py)
Collecting requests!=2.11.0,>=2.5.2 (from docker-py)
  Cache entry deserialization failed, entry ignored
  Cache entry deserialization failed, entry ignored
  Downloading requests-2.18.4-py2.py3-none-any.whl (88kB)
    100% |████████████████████████████████| 92kB 8.2MB/s
Collecting docker-pycreds>=0.2.1 (from docker-py)
  Cache entry deserialization failed, entry ignored
  Cache entry deserialization failed, entry ignored
  Downloading docker_pycreds-0.2.2-py2.py3-none-any.whl
Requirement already satisfied: idna<2.7,>=2.5 in /usr/local/lib/python2.7/site-packages (from requests!=2.11.0,>=2.5.2->docker-py)
Requirement already satisfied: urllib3<1.23,>=1.21.1 in /usr/local/lib/python2.7/site-packages (from requests!=2.11.0,>=2.5.2->docker-py)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python2.7/site-packages (from requests!=2.11.0,>=2.5.2->docker-py)
Collecting chardet<3.1.0,>=3.0.2 (from requests!=2.11.0,>=2.5.2->docker-py)
  Cache entry deserialization failed, entry ignored
  Cache entry deserialization failed, entry ignored
  Downloading chardet-3.0.4-py2.py3-none-any.whl (133kB)
    100% |████████████████████████████████| 143kB 7.7MB/s
Installing collected packages: chardet, requests, docker-pycreds, docker-py
  Found existing installation: chardet 2.0.1
    DEPRECATION: Uninstalling a distutils installed project (chardet) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling chardet-2.0.1:
      Successfully uninstalled chardet-2.0.1
  Found existing installation: requests 1.2.3
    Uninstalling requests-1.2.3:
      Successfully uninstalled requests-1.2.3
Successfully installed chardet-3.0.4 docker-py-1.10.6 docker-pycreds-0.2.2 requests-2.18.4
You are using pip version 9.0.3, however version 10.0.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

我还注意到安装 awscli 的问题,它抱怨未安装某些软件包。 (虽然首先安装它们可以解决问题)。

例如,如果我尝试强制重新安装 awscli,我会收到相同的 PyYAML 错误:
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.

support

最有用的评论

我使用了以下步骤并解决了这个问题

  1. 精简版:
    pip install --upgrade --force-reinstall pip==9.0.3
  2. 尝试重新安装软件包:
    pip install xxx --disable-pip-version-check
  3. 最后,恢复pip的最新版本:
    pip install --upgrade pip

所有41条评论

Se #4805 和 #3389 的历史记录。 基本上,pip 无法正确卸载“纯”distutils 安装的软件包,因为 distutils 没有记录足够的元数据让我们这样做。 我们之前已经删除了安装元数据,所以看起来我们已经安装了,但我们不得不留下文件。 这会导致问题。 从 pip 8 开始,我们一直试图停止这样做,因为它会导致问题,但我们最初的尝试被撤销,因为它当时影响了太多人。 使用 pip 10,我们终于停止尝试卸载 distutils 包,现在我们将问题报告给用户,如您在此处看到的。

基本上,如果您(或您使用的某些基础设施)使用 distutils 安装了一个软件包,您需要管理(特别是)“使用 distutils”卸载它。 不幸的是 distutils 不包含卸载命令,因此“使用 distutils 卸载”意味着手动删除软件包。

@pfmoore感谢您的快速回答!

这是相当不方便的,因为大多数软件包都是作为依赖项安装的,我们自己不管理它。 自动删除会很有趣。

我看到有一些运动只升级软件包,而不先卸载它们。 如果这最终会发生,那就太好了。

我们可以关闭这个问题,因为它在其他地方被广泛讨论。 谢谢!

尝试从“站点包”中手动删除包。 这工作完美!

我似乎通过提供带有命令的 pip 版本来解决这个问题
pip install -I==9.0.3 -r requirements.txt

我使用了以下步骤并解决了这个问题

  1. 精简版:
    pip install --upgrade --force-reinstall pip==9.0.3
  2. 尝试重新安装软件包:
    pip install xxx --disable-pip-version-check
  3. 最后,恢复pip的最新版本:
    pip install --upgrade pip

这似乎为我解决了这个问题: https :

在上面的原始情况下,那就是:

pip install docker-py --ignore-installed PyYAML

不知道你是谁,但我爱你。

那么@pfmoore对于自动化 pip 安装的团队,您有什么建议? 我们使用 terraform 设置我们的服务器,因此我们自动为 smart-open 和 boto3 调用 pip install,然后我们在 requirements.txt 中有 numpy、scipy、boto、sklearn 和 datadog。 对于多次安装,我们收到 urllib3 的 distutils 错误(因为 smart-open 安装了它)。 当我使用--ignore-installed urllib3 ,安装工作正常,但是有没有更合适的方法来解决这个问题?

另外,distutils 是否有可能添加卸载功能或更多元数据? 你们有没有和那个团队谈过这个?

@ruby-is-pretty-cool 我对此没有真正的看法。 你说 urllib3 “因为 smart-open 安装了它”,但我在 smart-open 中没有看到任何声明对 urllib3 的依赖,所以我不知道你的意思。 如果 smart-open 以某种方式以触发此问题的方式安装 urllib3,这听起来像是 smart-open 问题。

另外,distutils 是否有可能添加卸载功能或更多元数据? 你们有没有和那个团队谈过这个?

不是我所知道的,不,我们还没有和他们谈过这件事。 我怀疑他们会这样做,因为现在 distutils 并没有真正实现新功能(但如果您愿意,请随时询问)。 官方打包文档无论如何都不建议直接使用 distutils,所以如果项目正在这样做,那么管理影响真的取决于他们。

我只是尝试安装 smart-open。 这取决于请求,而请求又取决于 urllib3。 当我在 virtualenv 中进行安装时,pip 正确安装了它。 您是在系统环境中进行此安装吗? 在这种情况下,您是否看到(并尝试升级)系统安装了 urllib3? 如果是这样,通常的建议“不要在系统包上使用 pip”适用 - 使用 virtualenv 或者如果您需要安装到系统环境中,请使用发行版包。

我对 Python 打包很陌生,但我有一种感觉,无论是 virtualenv 还是发行版包都可以解决我们的问题——我将不得不更多地研究它们。 感谢您的帮助!

疯了吧。 由于某些类似宗教的信仰,设施正在被破坏。 如果某个包的某个 setup.py 条目触及 urllib3,则无法告诉它忽略它。 在我们的例子中,我们必须升级 urllib3,因为在 Ubuntu 14 中安装的 pip (v1.5.x) 版本拒绝从 https URL 安装包。

关键是如果他们不停止工作,没有人会升级“系统”包。 在 linux 内核项目中,这种行为是“破坏用户空间”,而 Torvalds 对此反应不佳。 令人难以置信的是,人们自然而然地接受了蟒蛇。

至少你应该在 pip 消息中警告人们“这个版本的 pip 将拒绝工作,如果它意味着升级系统包,这样做然后这样做。如果你正在使用旧的安装程序或旧的安装程序,请使用 pip 版本 9.x系统。” 或类似。

好吧,我没有注意,因为我的还在冲洗,但是,我的观点更简单。
只是积极升级用户空间的全部原因是:ATT&T 和伯克利仍然在关注谁建造了垃圾桶,可以说……如果你在 aha1542 上安装了该死的东西,你可以放弃由于许可而使用的 joilet; 正如最近也出现的那样,他们首先解释了我们为什么要做这件事; 为了基督的缘故,是有选择和合作。 我仍然以某种方式困惑为什么 slackeware 和 *bsd 路径深入,但无论如何,即使在两个阵营中,1 将驱动另一个,我会厌倦内核,回到 2.x,16+ 屏幕, (我还没有在菜单中重新找到 promix 驱动程序,但我离题了,现在回到我的常规日程安排中,WTF 我们不能得到一个 .app 所以这该死的工作日。(当然是搞砸了。)

我同意@pabloa - 这已经永远发生了,因此 CentOS 7 的 vanilla 安装无法安装docker-compose

是的, @JohnBDonner ,那面小旗子为我节省了很多时间。 谢谢你

初始错误

“无法卸载'pywin32'。这是一个distutils安装的项目,因此我们无法准确确定哪些文件属于它,这只会导致部分卸载”

我如何到达那里?

我已经在我的机器上安装了 pywin32==221,现在我正在尝试卸载它的升级版本(pywin==224),我已经获得了它的“.whl”的链接,我面临着安装它们的挑战因为我收到以下错误“无法卸载 'pywin32'。这是一个安装了 distutils 的项目,因此我们无法准确确定哪些文件属于它,这只会导致部分卸载.” . 我在 Window 10 64bit 上,使用 py3.4 32bit。

我这样做的原因是什么?

是因为我的机器中的“win32.client”似乎只有“优化”python文件“.pyo文件扩展名”。 当我收到编译错误说我没有可用于“from win32com.client import Dispatch”的“Dispatch”模块时,我发现了这一点。 感谢有人可以帮助我。

你疯了兄弟??

不,但感谢随机滥用。 这让我在业余时间做这件事很有意义 :smile:

它不是为了解决问题。 它旨在解释为什么事情是这样的,以及为什么 pip 不能解决问题。 仅仅因为人们对这种情况感到悲伤并不能改变它。

是否可以更改 disyutils 使用的安装程序包,以便
它包括所需的元数据?
2018 年 11 月 22 日星期四下午 12:56 保罗·摩尔通知@github.com
写道:

它不是为了解决问题。 它是为了解释为什么
事情就是这样,为什么pip不能解决问题。 只是
因为人们对这种情况感到悲伤并不会改变它。


您收到此消息是因为您发表了评论。
直接回复本邮件,在GitHub上查看
https://github.com/pypa/pip/issues/5247#issuecomment-441095536或静音
线程
https://github.com/notifications/unsubscribe-auth/ADrjCZvIpDr4X1sxcSZe3rRH7MBnn7Tsks5uxuVagaJpZM4TWMU4
.

>

尼克·阿特曼
+1 (330) 558-1230

我不知道,我不在 distutils 上工作。 但即使是这样,现在人们为什么还要使用 distutils 呢? 这个线程是关于已经使用 distutils 安装的包。 对于这些问题的解决方案已经在本主题前面提到过

@AddoSolutions您要求的更改称为setuptools

所以我在这个线程上的原因是因为我经常使用香草
CentOS 7 盒子,并专门在它们上面安装 docker compose。 CentOS
带有 pip 的库存,问题是我收到了描述的这些错误
以上。

我个人不是 Python 用户,我只是使用 docker compose 和
在它上面穿梭。 我个人不知道 setuptools 之间的区别
还有distutils,我猜CentOS的python基本都装好了
安装时使用yum?

两件事:可以更新 yum 包,使其包含
正确的元数据? 或者,可以在收到此错误时,可以
该消息提供了有关如何操作的更多有用信息? 喜欢而不是
关于 distutils 的相对神秘的信息(再次对于像我这样使用
pip 我什至不知道那是什么)它可以说类似“方式
不建议安装 pip。 我们建议通过以下方式卸载
做 x 然后使用 x 重新安装”。 我觉得那样会
显着减少有此问题的人数。

想法?

注意:我完全意识到我可以挖掘差异,并且可能会,
但问这个给未来的用户,这也是感恩节,我想要
火鸡 :)
2018 年 11 月 22 日星期四下午 1:19,Ronny Pfannschmidt通知@github.com
写道:

@AddoSolutions https://github.com/AddoSolutions你要求的改变
for 被称为 setuptools


你收到这个是因为你被提到了。

直接回复本邮件,在GitHub上查看
https://github.com/pypa/pip/issues/5247#issuecomment-441099032或静音
线程
https://github.com/notifications/unsubscribe-auth/ADrjCTBfoKjBuYdceDeBM0bunByQ2bxJks5uxuq2gaJpZM4TWMU4
.

>

尼克·阿特曼
+1 (330) 558-1230

写 yum 包的更新 - 这几乎是发行版的工作 - 它没有这样做,但在某些情况下也没有包本身

当谈到企业发行版时 - 事情已经过时了 - 与您的供应商一起解决 - 开源上游对此没有权力,并且永远不必承担您在企业发行版中选择的支持负担 - 所以去找您的供应商

明白了。 所以这种情况下的 pip 包将由 CentOS 维护
组,而不是 pip 组?
2018 年 11 月 22 日星期四下午 5:38,Ronny Pfannschmidt通知@github.com
写道:

写 yum 包的更新 - 这几乎是
分发 - 它没有这样做,但也没有包
在某些情况下他们自己

当谈到企业发行版时——事情已经过时了——
与你的供应商一起解决——开源上游没有权力
并且永远不必为您的选择承担支持负担
企业发行版 - 所以去找你的供应商


你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/pypa/pip/issues/5247#issuecomment-441129627或静音
线程
https://github.com/notifications/unsubscribe-auth/ADrjCZAQ-ZBmpkm7izyKkE0WymSoT6M1ks5uxyd2gaJpZM4TWMU4
.

>

尼克·阿特曼
+1 (330) 558-1230

@AddoSolutions问题不是 pip,而是其他软件包 - pip 只是停止了伪装并放弃了对非常糟糕的事情的支持,现在东西在企业发行版等不良行为者身上分崩离析 - 所以你必须根据企业来整理软件包发行版和您的供应商

仅供参考 - 您可能会被告知使用系统中的 pip(由供应商管理)而不是随机的最新版本

我收到此错误wxPython

无法卸载“wxPython”。 这是一个 distutils 安装的项目,因此我们无法准确确定哪些文件属于它,这只会导致部分卸载。

它不在sitepackages ,而是在distpackages (这是有道理的),但是从文件夹中删除文件感觉不对。

原来我是通过apt ,所以apt remove --autoremove python-wxgtk3.0从我的系统中删除了这个包。

这“不是我们的问题,其他人解决了它”是 pip 所期望的。 该软件甚至不假装管理包冲突。 我收到此消息是将容器部署到许多系统的一部分。

感谢提供解决方法的人。 我已经改变了顺序——“pip install docker”在“pip install --upgrade pip”之前——这次有效。 希望这不会在将来引起问题(例如数据损坏)。

我对此的理解是,我们应该使用虚拟环境来保护自己免受环境中的奇怪影响……但是,我现在能够通过添加--user标志来解决这个问题:

pip3 install -r requirements.txt --user

https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption -user

您还可以尝试使用由您的环境/ distutils安装的瞬态依赖项的确切版本,因为它可能是兼容的。 在我的示例中,Pipenv 会将awscli==1.15.85apache-airflow==1.10.1的瞬态PyYAML依赖解析为 3.13,但系统已经安装了 3.11。 查看我本地开发机器上声明的依赖项,3.11 对两者都适用:

$ pipenv graph | egrep 'airflow|awscli|PyYAML'
apache-airflow==1.10.1
    - PyYAML [required: >=3.0, installed: 3.13]
awscli==1.15.85
  - PyYAML [required: >=3.10,<=3.13, installed: 3.13]

一个简单的pipenv install PyYAML==3.11将 PyYAML 固定在 3.11 并使两个包都满意:

$ pipenv install PyYAML==3.11
Installing PyYAML==3.11…
...
Locking [packages] dependencies…
✔ Success!

$ pipenv graph | egrep 'airflow|awscli|PyYAML'
apache-airflow==1.10.1
    - PyYAML [required: >=3.0, installed: 3.11]
awscli==1.15.85
  - PyYAML [required: >=3.10,<=3.13, installed: 3.11]

我的 Pipfile / Pipfile.lock 随后使用pipenv install --deploy --system干净地安装在 Ubuntu 14.04LTS 上。

我还检查了PyYAML==3.11是通过python3-yaml 3.11-3build1 安装的,它是cloud-init 18.4-0ubuntu1~16.04.2 的直接依赖项,我们在 EC2 上运行时广泛使用它。 18.04 LTS 和 18.10 都带有 PyYAML 3.12,只有 19.04 带有PyYAML ,这恰好是今天的最新版本。

也就是说,不惜一切代价避免系统依赖性和环境问题。 使用pipenv和/或virtualenv

我使用了以下步骤并解决了这个问题:

  1. 精简版,
    pip install --upgrade --force-reinstall pip==9.0.3
  2. 尝试重新安装软件包
    pip install xxx --disable-pip-version-check
  3. 最后,恢复pip的最新版本
    pip install --upgrade pip

这对我来说效果很好。 但是在此之后升级 pip 会给已安装的软件包带来任何问题吗?

@s-eswar 到目前为止,我们还没有发现包的问题,​​但可能有一种情况,如果使用高版本的 pip install 包,然后使用低版本重新安装或检查可能会出现依赖问题。 我建议总是使用低版本。 例如,pip 9.0.3。

@s-eswar 到目前为止,我们还没有发现包的问题,​​但可能有一种情况,如果使用高版本的 pip install 包,使用低版本重新安装或检查可能会出现依赖问题。 我建议总是使用低版本。 例如,pip 9.0.3。

@wangxf1987但对于使用具有相同配置的 ML 库,我们不会收到有关升级/使用较低版本的错误。

@s-eswar 我不确定 ML 库是否在较低版本下工作。 我使用 pip=9.0.3 可以使用最新版本的 Kubernetes。 应该检查需求文件是否需要最新版本的 pip 或在 dev env 中进行测试。

从 pip 8 开始,我们一直试图停止这样做,因为它会导致问题,但我们最初的尝试被撤销,因为它当时影响了太多人。 使用 pip 10,我们终于停止尝试卸载 distutils 包,现在我们将问题报告给用户,如您在此处看到的。

我相信“现在我们向用户报告问题”的部分被称为“将您的技术债务推给其他人”。 我要感谢所有人让我陷入惨败。 特别是因为我不是 Python 开发人员,而且我不知道如何修复它。 我现在在这个问题上花了几个小时。 万岁!

删除 Dist 包并运行

sudo rm -rf /usr/lib/python3/dist-packages/yaml

sudo rm -rf /usr/lib/python3/dist-packages/PyYAML-*

从 distutils 中删除文件夹有效

通过升级到较新版本,它应该可以解决问题,但 pip 引入了问题,真是讽刺。

解决办法是手动卸载,所以去.../anaconda3/lib/python3.*/site-packages/ 删除包的所有文件和文件夹

@ramonamis sudo pip install --ignore-installed PyYAML

这为我成功升级了它。

这也适用于 imutils:

pip install --upgrade imutils --ignore-installed imutils

我使用了以下步骤并解决了这个问题

  1. 精简版:
    pip install --upgrade --force-reinstall pip==9.0.3
  2. 尝试重新安装软件包:
    pip install xxx --disable-pip-version-check
  3. 最后,恢复pip的最新版本:
    pip install --upgrade pip

它对我有用,谢谢!

我使用了以下步骤并解决了这个问题

1. Reduced version:
   `pip install --upgrade --force-reinstall pip==9.0.3`

2. Tried to re-install package:
   `pip install xxx --disable-pip-version-check`

3. At last, recover the latest version for pip:
   `pip install --upgrade pip`

这是一个糟糕的解决方案。 我现在什么也做不了。

Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 python3-pip : Depends: python-pip-whl (= 9.0.1-2.3~ubuntu1) but 9.0.1-2.3~ubuntu1.18.04.1 is to be installed
               Recommends: python3-dev (>= 3.2) but it is not going to be installed
               Recommends: python3-setuptools but it is not going to be installed
               Recommends: python3-wheel but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
E: Could not read response to hello message from hook [ ! -f /usr/bin/snap ] || /usr/bin/snap advise-snap --from-apt 2>/dev/null || true: Success

我现在锁定这个线程。 @pfmoore的初始评论涵盖了这里的所有内容。 该线程的其余部分已经透露了支持请求或直接针对维护者的滥用。

此页面是否有帮助?
0 / 5 - 0 等级