ModuleNotFoundError: 找不到模块名为 'distutils.util'

更新到Ubuntu 20.04之后,每当我运行以下命令时:
pip install <some package>

或者

pip --version

它说:

adam@daryy:~$ pip3

Traceback (most recent call last):
  File "/usr/local/bin/pip3", line 5, in <module>
    from pip._internal.cli.main import main
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/main.py", line 10, in <module>
    from pip._internal.cli.autocompletion import autocomplete
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/autocompletion.py", line 9, in <module>
    from pip._internal.cli.main_parser import create_main_parser
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/main_parser.py", line 7, in <module>
    from pip._internal.cli import cmdoptions
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/cmdoptions.py", line 19, in <module>
    from distutils.util import strtobool
ModuleNotFoundError: No module named 'distutils.util'
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "/usr/local/bin/pip3", line 5, in <module>
    from pip._internal.cli.main import main
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/main.py", line 10, in <module>
    from pip._internal.cli.autocompletion import autocomplete
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/autocompletion.py", line 9, in <module>
    from pip._internal.cli.main_parser import create_main_parser
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/main_parser.py", line 7, in <module>
    from pip._internal.cli import cmdoptions
  File "/usr/local/lib/python3.7/dist-packages/pip/_internal/cli/cmdoptions.py", line 19, in <module>
    from distutils.util import strtobool
ModuleNotFoundError: No module named 'distutils.util'

即使我通常键入pip3pip

1解决方案可以在这里找到:https://askubuntu.com/questions/1223290/pip3-is-pointing-to-the-wrong-version-of-python。简而言之,对于所有pip命令,请运行python3 -m pip。祝你记住这个好运…… - levitopher
2请使用以下版本安装 sudo apt install python3.10-distutils - Do-do-new
真正的答案是python3.10-minimal中缺少这个模块,你需要安装python3.10-full。 - Jon Watte
19个回答

我在升级到Ubuntu 20.04后遇到了这个问题。我有一个依赖于Python 3.7的虚拟环境,为了避免重新安装整个Python 3.8的虚拟环境,我在Python 3.7上修复了distutils:
我添加了deadsnake PPA
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update

然后安装了Python 3.7的distutils包。
sudo apt install python3.7-distutils

注意:由于某种原因,我在安装后者时遇到了错误,我通过这种方式解决了问题。
sudo dpkg -i --force-overwrite /var/cache/apt/archives/python3.7-distutils_3.7.9-1+focal1_all.deb
sudo apt-get -f install 

32谢谢你的建议,我只需要运行sudo apt install python3.9-distutils就可以了。 - jgosar
8是的,谢谢,我需要这个用于python3.10 --> sudo apt install python3.10-distutils - Ali Rn
3我从Ubuntu 20.04升级到了22版本。这解决了我的问题。 - S.MC.
1谢谢,你的解决方案对我有效。 - Guilherme
我还需要安装python3.7-dev。 - Maël Pedretti
谢谢!对于Python 3.9,可以使用sudo apt install python3.9-distutils来安装。 - VIX
2为什么这个答案离第一名那么远? - JeremyKun
猜想它现在变得非常接近,非常迅速了 @JeremyKun - Suraj
看起来在2023年,deadsnakes PPA提供了python3.8-distutilspython3.9-distutils以及包含Python 3.10和Python 3.11的python3-distutils - gene_wood
谢谢,这就是解决办法,伙计 :) - undefined

模块未找到很可能意味着包未安装。
sudo apt-get install python3-distutils

sudo apt-get install python3-apt

如果它们已经安装好了,你可以尝试修复升级过程中可能出现的任何问题。
sudo apt-get install --reinstall package-name

31我已经尝试过了,这个方法不起作用。 - Rock Life
我注意到那些信息中列出了Python 3.7。Ubuntu 20.04 默认使用的是Python 3.8.2。python3 --version 返回什么结果? - Viginti
它说的是Python 3.8.2 - Rock Life
根据错误信息,你已经安装或重新安装了上述的apt软件包,并且你的系统想要使用Python 3.8。我认为你的pip安装可能出了问题。看起来pip3正在尝试找到Python 3.7,但我从Ubuntu 18.04升级后,我的系统上已经没有Python 3.7了。我建议尝试执行以下命令:sudo apt-get install --reinstall python3-pip - Viginti
无法工作,不知道为什么Ubuntu这么有问题。 - Rock Life
有人能真正提供有效的帮助吗? - Rock Life
1原来我的系统中缺少了distutils。+1 - Soutzikevich
1@rock-life 你可能被Debian的bug #979819所困扰,当你想要安装比你的Ubuntu/Debian自带版本更旧的Python版本时,这个bug会出现。请查看这个解决方法 - ankostis
1谢谢,今天对我有用。 - Omkar Nath Singh
1谢谢,这对我很有帮助。问题已解决。 - Guilherme
sudo apt install python3-distutils python3-apt - cremefraiche
@Viginti 看起来 python3-apt 不需要;在我的情况下,只安装 python3-distutils 就解决了错误。有什么想法为什么会这样? - 4wk_
1使用版本,例如sudo apt install python3.10-distutils - Do-do-new
对我来说,apt-get install python3-distutils-extra 就能解决问题。 - undefined

Debian决定将distutils从核心Python包中移除,因此它在最新版本的Debian和基于Debian的操作系统中不再包含。你应该可以通过执行sudo apt install python3-distutils来安装它。
然而,对我来说这并没有起作用。我使用的是Parrot OS,它与Ubuntu一样,也是基于Debian的。我升级了系统后,pip在python3.7上停止工作,并且我还遇到了错误ModuleNotFoundError: No module named 'distutils.util' 我尝试了很多方法来修复它并重新安装distutils,偶然间发现pip3在python3.8上确实可以工作。于是我尝试了python3.7 -m pip3 -V,得到了/usr/bin/python3.7: No module named pip3的错误,所以我决定查看/usr/lib文件夹。
我查看了/usr/lib/python3/dist-packages,一切看起来都很正常。然后我查看了/usr/lib/python3.7,发现了distutil文件夹。
我打开它,看到了__pycache__文件夹,__init__.py文件和一个version.py文件。我不知道应该有多少个文件在那里,或者代码应该是什么样的,但我知道这两个文件要么是错误的,要么缺少另一个文件。
然后我查看了/usr/lib/python3.8/distutil中的内容,发现完全不同。我找到了以下文件:
command                          Folder
__pycache__                      Folder
archive_util.py                  Python script
bcppcompiler.py                  Python script
cmd.py                           Python script
config.py                        Python script
core.py                          Python script
cygwinccompiler.py               Python script
debug.py                         Python script
dep_util.py                      Python script
errors.py                        Python script
extension.py                     Python script
fancy_getopt.py                  Python script
filelist.py                      Python script
file_util.py                     Python script
__init__.py                      Python script
log.py                           Python script
msvc9compiler.py                 Python script
_msvccompiler.py                 Python script
msvccompiler.py                  Python script
README                           Plain text file
spawn.py                         Python script
sysconfig.py                     Python script
text_file.py                     Python script
unixccompiler.py                 Python script
util.py                          Python script
version.py                       Python script
versionpredicate.py              Python script

这个看起来更有希望了,因为pip3可以工作,我认为distutils也应该可以,于是我尝试运行以下命令将其复制到python3.7文件夹中:
sudo cp -r /usr/lib/python3.8/distutils /usr/lib/python3.7/distutils
或者:
sudo mv /usr/lib/python3.7/distutils/ /usr/lib/python3.7/distutils_back
sudo ln -s /usr/lib/python3.8/distutils /usr/lib/python3.7/

然后我再次尝试了python3.7 -m pip -V,得到的结果是:

pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.7)

然后我尝试安装一些模块,一切都正常工作。 希望这对你有所帮助。

实际上,一个符号链接就足够了:sudo rm -rf /usr/lib/python3.8/distutil && sudo ln -s /usr/lib/python3.8/distutil /usr/lib/python3.7/distutil。但是对于非常复杂的组合,请阅读此解决方法底部的注释。 - ankostis
cp -r /usr/lib/python3.9/distutils /usr/lib/python3.7/distutils 这个方法对我有效。 - Petr Javorik
这是我在Raspberry Pi OS上将Python版本从3.9切换到3.8并使pip3和virtualenv正常工作时找到的唯一解决方案。 - Filip Kubicz
我遇到了类似的问题,但正好相反:我同时安装了Python 3.8和3.6。在3.6版本中,distutils文件夹下有代码,但在3.8版本中却没有。我将这个“包”复制到Python 3.8中,现在一切都正常工作了。 - mrmuggles
复制dist-utils从不同的Python版本中是一种非常脆弱和危险的解决方案!你应该正确安装相应的python3.x-distutils包。 - bluenote10

我来这里是为了找答案,但没有找到,但我自己解决了。
一段时间前,我使用update-alternatives玩过python版本,我相信我还手动编辑了一些脚本,现在,在从16.04更新到20.04之后,我遇到了和你一样的问题。我不确定我的修复方法是否“正确”,但对我来说有效:
~$ which pip3
/home/patryk/.local/bin/pip3
~$ vim /home/patryk/.local/bin/pip3

我把第一行改成了:
#!/usr/bin/python3.7

给:
#!/usr/bin/python3

帮助了我的案件。

确保根据Python版本安装适当的版本,例如获取所有可用版本(假设使用apt软件包管理器):
$ apt-cache search distutils
python-setuptools - Python Distutils Enhancements
python-setuptools-doc - Python Distutils Enhancements (documentation)
python3-d2to1 - Python3 support for distutils2-like setup.cfg files as package metadata
python3-setuptools - Python3 Distutils Enhancements
pypy-setuptools - PyPy Distutils Enhancements
python-d2to1 - Python support for distutils2-like setup.cfg files as package metadata
python-distlib - low-level components of python distutils2/packaging
python-distutils-extra - enhancements to the Python build system
python-stsci.distutils - Python packaging utilities for STScI's packages
python3-distlib - low-level components of python distutils2/packaging
python3-distutils-extra - enhancements to the Python3 build system
python3-stdeb - Python to Debian source package conversion plugins for distutils
python3-stsci.distutils - Python3 packaging utilities for STScI's packages
python3.7-distutils - distutils package for Python (version 3.7)
python3.8-distutils - distutils package for Python (version 3.8)
python3.9-distutils - distutils package for Python (version 3.9)

你可以在上面的输出中看到 python3.7-distutilspython3.8-distutilspython3.9-distutils,然后可以通过指定与你所需的 Python 版本相关联的版本来安装它,例如我有 python3.8 并且我想要执行以下操作:
$ sudo apt-get install python3.8-distutils

然后我会使用该Python版本运行pip(确保先运行echo $PYTHONPATH来确认路径中是否有python3.8(我的Python版本),否则pip将安装在错误的路径中),例如:
$ python3.8 -m pip install requests

1不是一个好的解决方案 - 在我的系统上,该命令只会输出"python3-distutils - 用于Python 3.x的distutils包",它没有按子版本进行分割。 - levitopher
2@levitopher 我觉得最近有所改变。 - 林果皞
@levitopher你的系统应该是这样的;似乎在升级后,Fruit没有删除旧的apt-repos,这就是为什么他得到了所有这些结果。你仍然可以从ubuntu网站下载它们。还要检查一下此SO回答底部的注释2的解释。 - ankostis
如果你遇到了错误Unable to locate package python3.8-distutils,可以运行sudo add-apt-repository ppa:deadsnakes/ppa来修复它。 - vladimir

确保将版本为3.10python替换为适当的版本。

安装Python3.10

Update system
    $ sudo apt-get update -y && sudo apt-get full-upgrade -y

Helps to add ppa repositories
    $ sudo apt install software-properties-common -y

Adding deadsnake repository
    $ sudo apt-add-repository ppa:deadsnakes/ppa

Installing python
    $ sudo apt-get install python3.10

安装 distutils.util

$ sudo apt-get install python3.10-distutils

仍然使用 python3.10 -m pip some_command 可能会导致错误,要修复它,请使用
$ curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10

在Ubuntu上使用ppa:deadsnakes/ppa安装Python3.10之后,我通过执行sudo apt install python3.10-distutils解决了这个错误。

我在将系统从Python 3.9升级到Python 3.10时遇到了这个问题,但是我的终端(在Pycharm中)自动加载了来自Python 3.9的venv - 引用了过时/丢失的包,因为升级过程安装了这些包的3.10版本。
重新创建我的venv解决了问题。
rm -r venv
python3 -m venv venv
source ./venv/bin/activate
pip3 install -r requirements.txt

我从deadsnakes PPA安装了Python的备用版本。我不得不为所有备用版本安装带有版本号的distutils,形式为python3.x-distutils。所以对于Python 3.9,我执行了sudo apt install python3.9-distutils

1这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审核 - Marc Vanhoomissen
然而,它解决了Python 3.9和Ubuntu 22.4的问题。 - KIC
据我所知,这实际上提供了最佳答案。它的表述方式听起来像是一条评论,但安装正确的python3.x-distutils版本是关键,比目前得票最高的建议简单地从不同的Python版本复制distutils要好得多。 - bluenote10
1还有一件事要提到:在我的情况下,将系统升级到22.04后,禁用了deadsnakes ppa源。因此,apt-cache search distutils没有显示“其他”python3.x-distutils版本,只显示了3.10的版本。通过使用sudo add-apt-repository ppa:deadsnakes/ppa && sudo apt update重新添加ppa,我可以安装缺失的distutils包。 - bluenote10

distutils包在Python版本3.12中已被移除。

它在Python 3.10中被PEP 632“弃用distutils模块”所废弃。对于仍在使用distutils且无法更新到其他替代方案的项目,可以安装setuptools项目:它仍然提供distutils功能。

https://docs.python.org/3.12/whatsnew/3.12.html


1这就是我需要的 - 在现代Python上运行pip install setuptools就解决了问题 - undefined