17

我正在运行安装了 python 3.6、3.7 和 3.8 的 Ubuntu 20.04。

我正在尝试使用“python3.7 -m pip install package”在 3.6 和 3.7 版本上使用 pip 安装一些软件包,但是,我收到了这个错误:

ModuleNotFoundError: No module named 'distutils.util

我已经安装python3-distutilspython3-distutils-extra安装了,但pip 仅适用于 python 3.8

如何让 pip 在 python 3.6 和 3.7 上安装包?

4

3 回答 3

6

deadsnakespyenv这样的东西呢,这些会有帮助吗?否则,您可能需要为较旧的 Ubuntu 版本(例如 18.04)添加apt存储库,但我不确定可能会产生什么副作用。这是我宁愿在Ask UbuntuSuper User上提出的问题。

于 2020-05-21T08:22:08.963 回答
4

(来自赏金描述)

我想要一个明确的解决方案,不涉及有人告诉我安装:

  • python-distutils
  • python3-distutils
  • python3-distutils-extra

我将向提到安装这些的任何人分发免费的 DOWNVOTES。

好吧,我有一些坏消息要告诉你。如果不安装这些软件包,就没有“官方”的方式来获取distutilsDebian 提供的python*软件包,除非你离开了 Debian 的默认软件包存储库。

这是 Debian 决定将 Python 标准库的各个部分拆分为单独的包的结果,基于他们将事物拆分为运行时包和开发包的政策。他们认为 distutils 属于“开发”部分,因此,不要将它作为标准python包的一部分分发。


基本上,您的选择是:

  • 安装一个python*-distutils包。
    • 这是您的操作系统维护人员建议在您的情况下执行的操作。
    • 你还没有解释为什么你会为任何推荐这个的人“免费投反对票”,但这确实是“最正确”的解决方案。
  • 从不破坏标准库的地方安装 Python。
    • 这意味着使用官方 debian 存储库以外的包源。
    • 最简单的来源是deadsnakes ppa
  • 编译你自己的 Python!
    • 这实际上并不难,像pyenv这样的工具可以很容易地编译和管理多个 python 版本。
  • 破解问题!
    • 您可以...从 CPython 的 repo 下载源代码,并将Lib/distutils文件夹放在导入路径中的某个pythonX.Y位置 这是一个 100% 的 hack,我强烈建议不要这样做。如果发生了不好的事情,因为你这样做了,我概不负责。
于 2020-05-21T22:07:40.540 回答
1

我一直在寻找这个问题的答案几乎和你一样长,终于找到了解决方案。

请注意,我可能把我的 python3.8 安装搞砸了,因为它可能会在你运行 apt-update 时再次卸载包并破坏。

此外,可能可以减少命令的数量,但这是我最终做的:

运行apt list以查看可用包的列表:

$ apt list -a python3-distutils
Listing... Done
python3-distutils/focal-updates,focal-updates,focal-security,focal-security,now 3.8.5-1~20.04.1 all [installed]
python3-distutils/focal,focal 3.8.2-1ubuntu1 all
python3-distutils/bionic-updates,bionic-updates 3.6.9-1~18.04 all
python3-distutils/bionic,bionic 3.6.5-3 all

然后下载“仿生” deb 包,因为它实际上包含多个版本的distutils, 用于 Python 3.6、3.7 和 3.8:

$ apt download python3-distutils/bionic
Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 python3-distutils all 3.6.9-1~18.04 [144 kB]
Fetched 144 kB in 0s (661 kB/s)

最后,安装 deb 包:

$ sudo dpkg --install python3-distutils_3.6.9-1~18.04_all.deb 
dpkg: warning: downgrading python3-distutils from 3.8.5-1~20.04.1 to 3.6.9-1~18.04
(Reading database ... 193375 files and directories currently installed.)
Preparing to unpack python3-distutils_3.6.9-1~18.04_all.deb ...
Unpacking python3-distutils (3.6.9-1~18.04) over (3.8.5-1~20.04.1) ...
Setting up python3-distutils (3.6.9-1~18.04) ...

至此,我终于可以在python3.6中使用pip了。


注意 1:上面的打印输出apt list -a取决于您运行的是Ubuntu还是Debian发行版,以及您在 /etc/apt/sources.list* 中激活了哪个 apt-repos。

注2:如上例python3-distutils/bionic所示,包的名称并不总是与其内容一致。要查看它们,您必须下载它并使用dpkg -C <pafkage-file>或从远程使用 进行检查apt-file list python3-distutils

注意 3:如果您找不到特定 Python 版本的确切 distutils版本,您可以安装较早的版本并对其进行符号链接。例如,截至 2020 年 1 月,在 Debian-unstable("sid") 和 "bullseye" 中python3-distutils,它们的 apt-repos 中包含的包仅包含适用于 Python3.9 的文件,而之前来自 "buster" 的 apt-repos 包含适用于 Python3 的文件.7 只。所以如果你想distutils为 Python3.8 安装,你必须下载“buster”包并执行:

$ sudo dpkg --unpack python3-distutils_3.7.3-1_all.deb 
$ sudo rm /usr/lib/python3.8/distutils/distutils/
$ sudo ln -w /usr/lib/python3.{7,8}/distutils/distutils/
于 2020-10-09T10:21:20.417 回答