没有名为 distutils 的模块....但已安装 distutils?

jer*_*man 40 python distutils python-3.x

我想升级我的 python 版本(在本例中升级到 3.10),因此在安装 python3.10 之后,我继续尝试添加一些我使用的模块,例如 opencv ,这遇到了:

jeremy@jeremy-Blade:~$ python3.10 -m pip install opencv-python 
Traceback (most recent call last):
  File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/pip/__main__.py", line 16, in <module>
    from pip._internal.cli.main import main as _main  # isort:skip # noqa
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/main.py", line 10, in <module>
    from pip._internal.cli.autocompletion import autocomplete
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/autocompletion.py", line 9, in <module>
    from pip._internal.cli.main_parser import create_main_parser
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/main_parser.py", line 7, in <module>
    from pip._internal.cli import cmdoptions
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/cmdoptions.py", line 19, in <module>
    from distutils.util import strtobool
ModuleNotFoundError: No module named 'distutils.util'

jeremy@jeremy-Blade:~$ sudo apt-get install python3-distutils
[sudo] password for jeremy: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
python3-distutils is already the newest version (3.8.10-0ubuntu1~20.04).
...
0 upgraded, 0 newly installed, 0 to remove and 4 not upgraded.
Run Code Online (Sandbox Code Playgroud)

由于 distutils 似乎已经安装,我不知道如何继续。

小智 65

在您的机器上安装setuptools

pip install setuptools
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题

  • 对于拥有 python 最新版本(3.12)的人来说,这是有效的。有人可以解释一下为什么吗?谢谢 (6认同)
  • 您可以查看 PR gh-95299,其中指出:不要在使用 venv 创建的虚拟环境中预安装 setuptools。这意味着默认情况下 distutils、setuptools、pkg_resources 和 easy_install 将不再可用;要访问这些,请在激活的虚拟环境中运行 pip install setuptools。 (3认同)

Pal*_*ine 57

distutils包被删除于python version 3.12

\n
\n

它在 Python 3.10 中被 PEP 632 \xe2\x80\x9c 弃用 distutils module\xe2\x80\x9d。对于仍在使用 distutils 且无法更新为其他内容的项目,可以安装 setuptools 项目:它仍然提供 distutils。

\n
\n

编辑:解释和解决方法

\n

Python 3.12 发布文档提到:

\n
\n

gh-95299:不要在使用 venv 创建的虚拟环境中预安装 setuptools。这意味着默认情况下 distutils、setuptools、pkg_resources 和 easy_install 将不再可用;要访问这些,请在激活的虚拟环境中运行 pip install setuptools。

\n
\n

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

\n
\n

正如@MahmudAlam 的回答:

\n

在您的虚拟环境中使用以下命令

\n
pip install setuptools\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
pip3 install setuptools\n
Run Code Online (Sandbox Code Playgroud)\n
\n

完整迁移建议:https://peps.python.org/pep-0632/#migration-advice

\n

  • py3.12+ 中 distutils 的替代品是什么? (2认同)

jer*_*man 47

看起来 distutils 有版本控制,所以之后

jeremy@jeremy-Blade:~$ sudo apt-get install python3.10-distutils 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
...
Setting up python3.10-lib2to3 (3.10.0-1+focal1) ...
Setting up python3.10-distutils (3.10.0-1+focal1) ...

jeremy@jeremy-Blade:~$ python3.10 -m pip install opencv-python 
Run Code Online (Sandbox Code Playgroud)

似乎可以继续进行。

  • 没有为我工作我仍然得到“ModuleNotFoundError:没有名为'distutils.util'的模块” (5认同)

小智 11

这为我解决了这个问题

sudo apt-get install --reinstall python3.7-distutils
Run Code Online (Sandbox Code Playgroud)

您也可以将 3.7 替换为您的 python 版本


小智 6

sudo apt-get install python3.9-distutils
Run Code Online (Sandbox Code Playgroud)

这解决了我使用Python3.9的问题