如何升级disutils包中的PyYAML?

113

我试图安装 chatterbot,但它依赖于 PyYAML=3.12。在我的 Ubuntu 机器上已经安装了 PyYAML 版本 3.11。所以我使用下面的命令来升级 PyYAML:

sudo -H pip3 install --upgrade PyYAML

但是它报错如下:

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

我的 pip3 版本是 10.0.0。

如何解决这个问题?


9
你应该总是在虚拟环境中使用最新版本的Python安装类似Chatterbot这样的程序(可能不是Ubuntu系统Python使用的版本),这样你就可以使用需要的任何库的版本,而不会破坏系统程序。这样做对于像PyYAML 3.12这样几乎没有变化的版本不是很重要,但对于某些包来说会破坏系统。 - Anthon
4
请将以下内容翻译成中文:@Anthon请把你的评论转换为答案。我认为这应该被视为此问题的最佳答案。 - Stephen G Tuggy
1
@Anthon 是的,除非你在 Docker 容器中安装。 - CpILL
@CpILL 你应该在 Docker 容器中使用 Python 虚拟环境。 - howaryoo
1
@howaryoo,那篇文章没有说服我值得这样做的理由。"沿着路线进行的操作系统级更改" 是不可能发生的,因为这就是容器的重点,操作系统是固定的,并且也是干净的安装。 - CpILL
显示剩余2条评论
10个回答

192

尝试使用--ignore-installed标志:

sudo -H pip3 install --ignore-installed PyYAML

这是因为要升级软件包,pip首先会卸载旧版本,然后安装新版本。对于distutils软件包来说,卸载步骤会失败。使用--ignore-installed标志,卸载步骤将被跳过,新版本将简单地安装在旧版本之上。


3
当执行conda update env -f environment.yml时出现错误,有什么解决方法吗? - Austin

75
你可以试试这个:
pip install --ignore-installed PyYAML

2
这似乎是最明智的答案... 没有遗憾 - mmann1123
1
工作时没有出过差错。 - Valentin

30
我在这个Github问题中发现pip 10不再卸载distutils软件包。所以我降级到pip 8.1.1。现在它可以工作了。
如果有任何人,谁正在查看这个问题,知道如何使用pip 10.0.0卸载或升级distutils软件包,请在此处让我知道。 :)
(如果有人需要) 而要降低pip版本,我使用了以下命令: sudo -H pip3 install pip==8.1.1

为什么是8.1.1版本?只是好奇,但这个版本运行得很好! - Tony-Caffe
4
我最终删除了distutils中的文件夹:sudo rm -rf /usr/lib/python3/dist-packages/yaml, sudo rm -rf /usr/lib/python3/dist-packages/PyYAML-* - baldr
@Tony-Caffe 嗯,在升级之前,我的pip版本是8.1.1。所以我降级到了8.1.1。但我认为它也适用于8.0.*。 - sphoenix

13

问题:

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

解决方案: 删除Dist Package并运行

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

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

从distutils中删除文件夹即可解决问题。


2
即使删除了dist文件,它仍然无法正常工作,仍然会出现相同的错误。 - Schütze

6
我个人在Anaconda上安装了PyYAML(Python语言的YAML解析器),只需执行“conda remove PyYAML”,然后执行pip命令即可。

8
这导致我的Anaconda出现问题,Numpy不见了,我不得不重新安装。 - Jonathan Mugan
3
谢谢您的启发,这可能是由于conda安装引起的。我没有删除,而是使用了conda update,解决了我的pip install问题,而不会像上面提到的其他依赖关系一样出现故障。 - Christopher Howlin

5
conda remove PyYAML

conda remove需要一些时间

pip install chatterbot
pip install chatterbot_corpus

这样做解决了我在尝试 from chatterbot import chatbot 时遇到的错误。


3

我曾遇到过类似问题,即使用conda安装了PyYAML包。有人提出了另一种解决方法,即使用conda remove

但实际上,我通过使用conda update PyYAML来解决这个问题,从而使用conda更新了pip试图更新的依赖项。


2

我刚刚不得不卸载python3-yaml并再次尝试使用pip

sudo apt-get purge python3-yaml

2
这是一个非常糟糕的想法,它会卸载重要的东西,比如 ubuntu-desktop - Benjamin Bray
为什么卸载YAML解析器会卸载ubuntu-desktop?我甚至没有看到它作为依赖包:https://packages.ubuntu.com/bionic/python3-yaml - Hem
1
看起来 apt purge 命令也会删除依赖于 python3-yaml 的许多软件包。我自己尝试了这个命令,apt 警告我如果继续执行,ubuntu-desktop 和其他一些重要的软件包也将被删除。 - Benjamin Bray

1
如果你的情况不是--ignore-installed,并且你正在运行Debian/Ubuntu,则可以尝试以下解决方案。
可能可以通过apt安装PyYAML作为其他软件包的依赖项。
要进行调试,请执行以下步骤: 1. 检测软件包名称: 运行apt list --installed | grep python并搜索任何yaml出现。 2. 假设您发现了一个软件包python3-yaml。 3. 搜索反向依赖项: apt-cache rdepends --installed python3-yaml 然后你可以: 1. 删除未使用的反向依赖项以及python3-yaml 2. 或者通过dpkg -r --force-depends python3-yaml删除python3-yaml并通过pip重新安装它 3. 或者自己做决定并在评论中分享结果

0
以下代码可以帮助您:
rm -rf /usr/lib/python3/dist-packages/yaml
rm -rf /usr/lib/python3/dist-packages/PyYAML-*
rm -rf /usr/lib/python3.8/site-packages/PyYAML-*
sudo -H pip3 install --ignore-installed PyYAML

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接